<?php
namespace App\Controller;
use ReflectionMethod;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Form\Filters\BannedIpFilter;
use App\Form\Filters\MemberDeleteFilter;
use App\Form\Filters\CompanyDeleteFilter;
use App\Form\Filters\CompanyTrashFilter;
use App\Repository\UsersDeleteRequestsRepository;
use App\Repository\CompaniesRepository;
use App\Repository\TrashItemsRepository;
use App\Entity\User;
use App\Entity\UserCrms;
use App\Entity\TrashItems;
#[Route('/trash')]
class ManageDeleteController extends AbstractController
{
#[Route('/user', defaults: ['page' => '1'], methods: ['GET'], name: 'user_manage_delete_index')]
#[Route('/user/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'user_manage_delete_index_paginated')]
#[Cache(smaxage: 10)]
public function index(Request $request,int $page,EntityManagerInterface $entityManager,UsersDeleteRequestsRepository $usersDeleteRequestsRepository): Response
{
$params = $request->query->all();
$filter = [];
$filterForm = $this->createForm(MemberDeleteFilter::class);
if(isset($params['name_email'])) {
$filterForm['name_email']->setData($params['name_email']);
$filter['name_email'] = $params['name_email'];
}
if(isset($params['crm'])) {
$filterForm['crm']->setData($params['crm']);
$filter['crm'] = $params['crm'];
}
if(isset($params['is_processing'])) {
$filterForm['is_processing']->setData($params['is_processing']);
$filter['is_processing'] = $params['is_processing'];
}
$data = $usersDeleteRequestsRepository->adminPaginatorFetchAll($page, $filter);
return $this->render('manage-delete/user-index.html.twig', [
'paginator' => $data,
'filter' => $filter,
'form' => $filterForm->createView(),
]);
}
#[Route('/crm', defaults: ['page' => '1'], methods: ['GET'], name: 'company_manage_delete_index')]
#[Route('/crm/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'company_manage_delete_index_paginated')]
#[Cache(smaxage: 10)]
public function companyIndex(Request $request,int $page,EntityManagerInterface $entityManager,CompaniesRepository $companiesRepository): Response
{
$params = $request->query->all();
$filter = [];
$filterForm = $this->createForm(CompanyDeleteFilter::class);
if(isset($params['crm'])) {
$filterForm['crm']->setData($params['crm']);
$filter['crm'] = $params['crm'];
}
if(isset($params['name_email'])) {
$filterForm['name_email']->setData($params['name_email']);
$filter['name_email'] = $params['name_email'];
}
if(isset($params['is_processing'])) {
$filterForm['is_processing']->setData($params['is_processing']);
$filter['is_processing'] = $params['is_processing'];
}
$data = $companiesRepository->adminDeletedPaginatorFetchAll($page, $filter);
return $this->render('manage-delete/company-index.html.twig', [
'paginator' => $data,
'filter' => $filter,
'form' => $filterForm->createView(),
]);
}
#[Route('/delete/{id}', name: 'user_manage_delete_index_delete', methods: ['POST','GET'])]
public function delete(Request $request, User $user, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete'.$user->getUserId(), $request->request->get('_token'))) {
$user->setPermanentDelete(1);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('error', 'Delete successfully.');
return $this->redirectToRoute('user_manage_delete_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage-delete/member_delete_form.html.twig', [
'user' => $user,
]);
}
#[Route('/crm-delete/{id}', name: 'company_manage_delete_index_delete', methods: ['POST','GET'])]
public function companyDelete(Request $request, UserCrms $companies, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete'.$companies->getCrmId(), $request->request->get('_token'))) {
$companies->setPermanentDelete(1);
$entityManager->persist($companies);
$entityManager->flush();
$this->addFlash('error', 'Delete successfully.');
return $this->redirectToRoute('company_manage_delete_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage-delete/company_delete_form.html.twig', [
'companies' => $companies,
]);
}
#[Route('/dismiss-request/{id}', name: 'company_manage_delete_dismiss_request', methods: ['POST','GET'])]
public function dismissRequest(Request $request, UserCrms $companies, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('dismiss'.$companies->getCrmId(), $request->request->get('_token'))) {
$companies->setPermanentDelete(0);
$companies->setIsDelete(0);
$entityManager->persist($companies);
$entityManager->flush();
return $this->redirectToRoute('company_manage_delete_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage-delete/company_dismiss_request_form.html.twig', [
'companies' => $companies,
]);
}
#[Route('/user-dismiss-request/{id}', name: 'user_manage_delete_dismiss_request', methods: ['POST','GET'])]
public function userDismissRequest(Request $request, User $user, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('dismiss'.$user->getUserId(), $request->request->get('_token'))) {
$user->setPermanentDelete(0);
$user->setIsDeleted(0);
$entityManager->persist($user);
$entityManager->flush();
$companies = $entityManager->getRepository(\App\Entity\UserCrms::class)->findOneBy(array('userId' => $user->getUserId()));
if($companies){
$companies->setIsDelete(0);
$entityManager->persist($companies);
$entityManager->flush();
}
$usersDeleteRequests = $entityManager->getRepository(\App\Entity\UsersDeleteRequests::class)->findOneBy(array('userId' => $user->getUserId()));
if($usersDeleteRequests){
$entityManager->remove($usersDeleteRequests);
$entityManager->flush();
}
$this->addFlash('error', 'Delete successfully.');
return $this->redirectToRoute('user_manage_delete_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage-delete/member_dismiss_request_form.html.twig', [
'user' => $user,
]);
}
#[Route('/', defaults: ['page' => '1'], methods: ['GET'], name: 'company_manage_trash_index')]
#[Route('/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'company_manage_trash_index_paginated')]
#[Cache(smaxage: 10)]
public function companyTrash(Request $request,int $page,EntityManagerInterface $entityManager, TrashItemsRepository $trashHistoriesRepository): Response
{
$params = $request->query->all();
$filter = [];
$filterForm = $this->createForm(CompanyTrashFilter::class);
if(isset($params['start_date'])) {
$filterForm['start_date']->setData($params['start_date']);
$filter['start_date'] = $params['start_date'];
}
if(isset($params['end_date'])) {
$filterForm['end_date']->setData($params['end_date']);
$filter['end_date'] = $params['end_date'];
}
if(isset($params['crm'])) {
$filterForm['crm']->setData($params['crm']);
$filter['crm'] = $params['crm'];
}
if(isset($params['name'])) {
$filterForm['name']->setData($params['name']);
$filter['name'] = $params['name'];
}
if(isset($params['enquiry_id'])) {
$filterForm['enquiry_id']->setData($params['enquiry_id']);
$filter['enquiry_id'] = $params['enquiry_id'];
}
if(isset($params['badge'])) {
$filterForm['badge']->setData($params['badge']);
$filter['badge'] = $params['badge'];
}
$data = $trashHistoriesRepository->adminPaginatorFetchAll($page, $filter);
return $this->render('manage-delete/trash-index.html.twig', [
'paginator' => $data,
'filter' => $filter,
'form' => $filterForm->createView(),
]);
}
#[Route('/resore/{id}', name: 'company_manage_delete_resore', methods: ['POST','GET'])]
public function resore(Request $request, TrashItems $trashHistories, EntityManagerInterface $entityManager): Response
{
$params = $request->query->all();
$crmId = 0;
if(isset($params['crmId'])){
$crmId = $params['crmId'];
}
if ($this->isCsrfTokenValid('restore'.$trashHistories->getId(), $request->request->get('_token'))) {
$trashId = $trashHistories->getId();
$restoreData = json_decode($trashHistories->getParams(), true);
if(isset($restoreData['items'])){
foreach($restoreData['items'] as $key => $ids){
$fetchEntityName = "\App\Entity\Trash$key";
$newEntity = "\App\Entity\\".$key;
$fetchEntity = new $fetchEntityName();
$orgEntity = new $newEntity();
foreach($ids as $id){
if($id && $id != 'null' && $id != null){
$fetchEntityData = $entityManager->getRepository(get_class($fetchEntity))->find($id);
$idPropName = false;
if($fetchEntityData){
$props = $entityManager->getClassMetadata(get_class($fetchEntityData))->getColumnNames();
foreach($props as $propKey => $prop){
if($propKey == 0){
$idPropName = $prop;
}
$propName = ucfirst($prop);
if(str_contains($propName, '_')){
$newPropName = '';
$explodeValue = explode("_",$propName);
foreach($explodeValue as $key => $dValue){
$newPropName .= ucfirst($dValue);
}
$propName = $newPropName;
if($propKey == 0){
$idPropName = $newPropName;
}
}
$reflectionMethod = new ReflectionMethod(get_class($fetchEntityData),'get'.$propName);
$value = $reflectionMethod->invoke($fetchEntityData);
$reflectionMethod = new ReflectionMethod(get_class($orgEntity),'set'.$propName);
$reflectionMethod->invoke($orgEntity, $value);
}
$idPropName = lcfirst($idPropName);
$metadata = $entityManager->getClassMetadata(get_class($orgEntity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$entityManager->persist($orgEntity);
$entityManager->flush();
$entityManager->clear();
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_AUTO);
if($idPropName){
$query = $entityManager->createQueryBuilder()
->delete(get_class($fetchEntity),'c')
->where("c.{$idPropName} = {$id}")
->getQuery()->execute();
}
}
}
}
}
}
$query = $entityManager->createQueryBuilder()
->delete('App:TrashItems','c')
->where("c.id = {$trashId}")
->getQuery()->execute();
$this->addFlash('success', 'Restore successfully.');
if($request->request->get('crmId')){
if($request->request->get('redirect_page')){
return $this->redirectToRoute('manage_account_recycle_bin_paginated', ['id'=> $request->request->get('crmId'), 'page'=> $request->request->get('redirect_page')], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('manage_account_recycle_bin', ['id'=> $request->request->get('crmId')], Response::HTTP_SEE_OTHER);
}
if($request->request->get('redirect_page')){
return $this->redirectToRoute('company_manage_trash_index_paginated', ['page'=> $request->request->get('redirect_page')], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('company_manage_trash_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage-delete/restore.html.twig', [
'trashHistories' => $trashHistories,
'crmId' => $crmId,
'redirect_page' => $request->query->get('redirect_page')
]);
}
#[Route('/permanent-delete/{id}', name: 'company_manage_permanent_delete', methods: ['POST','GET'])]
public function permanentDelete(Request $request, TrashItems $trashHistories, EntityManagerInterface $entityManager): Response
{
$params = $request->query->all();
$crmId = 0;
if(isset($params['crmId'])){
$crmId = $params['crmId'];
}
if ($this->isCsrfTokenValid('permanentDelete'.$trashHistories->getId(), $request->request->get('_token'))) {
$source = json_decode($trashHistories->getParams(), true);
if(isset($source['items'])){
foreach($source['items'] as $key => $items) {
$fetchEntityName = "\App\Entity\Trash$key";
$fetchEntity = new $fetchEntityName();
if($items){
foreach($items as $item) {
if($item != '' && $item != null && $item != 'null' && $item) {
$fetchEntityData = $entityManager->getRepository(get_class($fetchEntity))->find($item);
if($fetchEntityData){
$entityManager->remove($fetchEntityData);
$entityManager->flush();
}
}
}
}
}
}
$entityManager->remove($trashHistories);
$entityManager->flush();
$this->addFlash('success', 'Permanent Delete successfully.');
if($request->request->get('crmId')){
if($request->request->get('redirect_page')){
return $this->redirectToRoute('manage_account_recycle_bin_paginated', ['id'=> $request->request->get('crmId'), 'page'=> $request->request->get('redirect_page')], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('manage_account_recycle_bin', ['id'=> $request->request->get('crmId')], Response::HTTP_SEE_OTHER);
}
if($request->request->get('redirect_page')){
return $this->redirectToRoute('company_manage_trash_index_paginated', ['page'=> $request->request->get('redirect_page')], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('company_manage_trash_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage-delete/permanent-delete.html.twig', [
'trashHistories' => $trashHistories,
'crmId' => $crmId,
'redirect_page' => $request->query->get('redirect_page')
]);
}
}