<?php
namespace App\Controller\API;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Pimcore\Bundle\AdminBundle\HttpFoundation\JsonResponse;
use Pimcore\Translation\Translator;
use Symfony\Component\HttpFoundation\RequestStack;
use Pimcore\Model\DataObject\Solution;
use Pimcore\Model\DataObject\Comment;
use App\Validator\Validator;
use App\Helper\ObjectJson;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\Feature;
use Pimcore\Model\DataObject\Review;
use Pimcore\Model\DataObject\FeaturePoints;
use App\Services\SolutionServices;
/**
* @Route("/api")
*/
class CompareController extends BaseController
{
const COMMENT_PAGE_DEFAULT = 1;
const COMMENT_PERPAGE_DEFAULT = 10;
const CLASS_NAME = 'solution';
private $validator;
private $translator;
private $request;
public function __construct(
Translator $translator,
Validator $validator,
RequestStack $requestStack
)
{
$this->request = $requestStack->getCurrentRequest();
$this->translator = $translator;
$this->validator = $validator;
}
/**
* @Route("/compare", name="api-compare", methods={"GET"})
*/
public function compare(Request $request,PaginatorInterface $paginator)
{
$messageError = $this->validator->validate([
'solution' => 'required',
], $request);
if ($messageError) return $this->sendError($this->translator->trans($messageError));
// ẩn tất cả các thông tin không cần thiết của solution
$hidenSolution=['description','categories','website','community','action','segment','video',
'banner','documents','features','faq','interactive','training','support','freeVersion','freeTrialDays',
'freeTrial','isPriority','deployment'];
$data=[];
// Lấy Solution trang mảng truyển vào
foreach($this->request->get('solution') as $key => $value){
// get solution
$solution = DataObject::getById($value);
// kiểm tra object xem có phải Class Solution
if($solution instanceof Solution){
// tạo mảng lấy dữ liệu solution
$data[$key] = ObjectJson::getJson($solution,$hidenSolution);
$data[$key]['featuresPoint']=[];
// Lấy điểm của Features
foreach ($solution->getFeatures() as $k=> $item) {
$featurePoints = new FeaturePoints\Listing();
$featurePoints->addConditionParam('feature__id = ?',$item->getId());
$featurePoints->addConditionParam('solution__id = ?',$solution->getId());
//Tính tổng điểm
$point=0;
foreach($featurePoints as $feature){
$point+=$feature->getPoint();
}
$total = $featurePoints->count() ? $point/$featurePoints->count() : 0;
$hidenCat = ['totalPoint','category','parent_id','code'];
// gán điểm vào mảng và tạo nhóm Features
if (array_key_exists($item->getParentId(), $data[$key]['featuresPoint'])) {
// nếu tồn tại key nhóm Features thì thêm vào mảng đã tồn tại
$dataItem = ObjectJson::getJson($item,$hidenCat);
$dataItem['point'] =$total;
$dataItem['totalReview']=$featurePoints->count();
$data[$key]['featuresPoint'][$item->getParentId()]['featureGroup'][] = $dataItem;
} else {
// chưa tồn tại key nhóm Features thì tạo mới
$data[$key]['featuresPoint'][$item->getParentId()]=ObjectJson::getJson($item->getParent(),$hidenCat);
$dataItem = ObjectJson::getJson($item,$hidenCat);
$dataItem['point'] =$total;
$dataItem['totalReview']=$featurePoints->count();
$data[$key]['featuresPoint'][$item->getParentId()]['featureGroup'][] = $dataItem;
}
}
// ẩn tất cả thông tin không cần thiết của review
$hidden = ['title','role','solution','categories','images','companyName',
'companyWebsite','statusUsing','checkImage','date','jobTitle','problemsEncountered','recommendation',
'answer','displayAccepted','pricing','policyAccepted'];
// Lấy dữ liệu phần Định vị sản phẩm
$review = SolutionServices::listingReview($solution->getId(),$hidden);
// tạo mảng companySize
$companySizes = DataObject\Service::getOptionsForSelectField(new Review, "companySize");
$companySizes = array_fill_keys(array_keys($companySizes), 0);
// tạo mảng industry
$industry = [];
//
$recommend = 0;
$companySizes['personal']=0;
// dd($review);
foreach($review as $value) {
if($value['purpose'] == 'business'){
$companySizes[$value['companySize']]++;
}else{
$companySizes['personal']++;
}
if (isset($value['industry']['name'])) {
if(array_key_exists($value['industry']['name'],$industry)){
$industry[$value['industry']['name']]++;
}else{
$industry[$value['industry']['name']]=1;
}
if($value['recommend']){
$recommend++;
}
}
}
// tính phần trăm companySizes
foreach($companySizes as $keyCom=>$companySize){
$companySizes[$keyCom]=count($review) ? round(($companySize/count($review))*100) : 0;
}
// gán vào mảng
$data[$key]['companySize']=$companySizes;
// tính phần trăm industry
foreach($industry as $keyInd=>$item){
$industry[$keyInd]=count($review) ? round(($item/count($review))*100) : 0;
}
// gán vào mảng
$data[$key]['industry']= (object) $industry;
// Lấy điểm của các mục
$pointReview = SolutionServices::pointReview($solution->getId(),$hidden);
$data[$key]['scoringItem']=$pointReview;
// Lấy review hài lòng
$outstandingReview = SolutionServices::outstandingReview($solution->getId(),$hidden,5);
$data[$key]['outstandingReview']=$outstandingReview;
// Lấy phần trăm đề xuất
$data[$key]['recommend']=count($review) ? round(($recommend/count($review))*100) : 0;
}
}
// dd($data,array_column($data,'id'));
return $this->sendResponse([
'data'=>$data,
'featuresList'=>$this->extractData($data,array_column($data,'id'))
]);
}
private function extractData($solutions, $solution_ids){
// dd($solutions);
$data = [];
foreach($solutions as $solution){
foreach($solution['featuresPoint'] as $groupFeatures){
if(array_key_exists('id',$groupFeatures)){
if(!isset($data[$groupFeatures['id']])){
$data[$groupFeatures['id']] = [
'id_group' => $groupFeatures['id'],
'name_group' => $groupFeatures['name'],
'data' => []
];
}
foreach($groupFeatures['featureGroup'] as $function){
$data[$groupFeatures['id']]['data'][$function['id']]['info'] = [
'id' => $function['id'],
'name' => $function['name'],
'description' => $function['description']
];
foreach($solution_ids as $solution_id){
if($solution_id == $solution['id']){
$data[$groupFeatures['id']]['data'][$function['id']]['solutions'][$solution_id]['point'] = $function['point'];
$data[$groupFeatures['id']]['data'][$function['id']]['solutions'][$solution_id]['totalReview'] = $function['totalReview'];
} else {
if(!isset($data[$groupFeatures['id']]['data'][$function['id']]['solutions'][$solution_id]) || $data[$groupFeatures['id']]['data'][$function['id']]['solutions'][$solution_id] == 0){
$data[$groupFeatures['id']]['data'][$function['id']]['solutions'][$solution_id]['point'] = 0;
$data[$groupFeatures['id']]['data'][$function['id']]['solutions'][$solution_id]['totalReview'] = 0;
}
}
}
}
}
}
}
return $data;
}
}