<?php
namespace App\Controller;
use App\Entity\SiteBannedIps;
use App\Entity\CrmEnquiries;
use App\Entity\UserCrms;
use App\Form\ManageCompaniesForm;
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\ManageCompaniesFilter;
use App\Form\Filters\CrmRecycleBinFilter;
use App\Repository\CompaniesRepository;
use App\Service\ServiceStorage;
use App\Service\ServiceEnquiry;
use App\Repository\TrashItemsRepository;
use App\Repository\EnquiriesRepository;
use App\Repository\UserSubscriptionsRepository;
use App\Form\Filters\UserSubscriptionsFilter;
#[Route('/manage/accounts')]
class ManageAccountsController extends AbstractController
{
#[Route('/', defaults: ['page' => '1'], methods: ['GET'], name: 'manage_account_index')]
#[Route('/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'manage_account_index_paginated')]
#[Cache(smaxage: 10)]
public function index(Request $request,int $page,EntityManagerInterface $entityManager,CompaniesRepository $companiesRepository): Response
{
$params = $request->query->all();
$filter = [];
$filterForm = $this->createForm(ManageCompaniesFilter::class,$params);
$data = $companiesRepository->adminPaginatorFetchAll($page, $params);
return $this->render('manage/accounts/index.html.twig', [
'paginator' => $data,
'filter' => $params,
'form' => $filterForm->createView(),
]);
}
#[Route('/details/{id}', name: 'manage_account_details', methods: ['GET'])]
public function details(UserCrms $companies): Response
{
return $this->render('manage/accounts/details.html.twig', [
'companies' => $companies,
]);
}
#[Route('/statistics/{id}', name: 'manage_account_statistics', methods: ['GET'])]
public function statistics(UserCrms $companies): Response
{
return $this->render('manage/accounts/statistics.html.twig', [
'companies' => $companies,
]);
}
#[Route('/members/{id}', name: 'manage_account_members', methods: ['GET'])]
public function listAllMembers($id, UserCrms $companies, EntityManagerInterface $entityManager): Response
{
$companyUser = $entityManager->getRepository(\App\Entity\UserCrmRelationships::class)->findBy(array('crmId' => $id));
return $this->render('manage/accounts/members.html.twig', [
'companies' => $companies,
'companyUser' => $companyUser,
]);
}
#[Route('/transaction/{id}', name: 'manage_account_transaction', methods: ['GET'])]
public function transactionList($id, UserCrms $companies, EntityManagerInterface $entityManager): Response
{
$userTransactions = $entityManager->getRepository(\App\Entity\UserTransactions::class)->findBy(array('crmId' => $id));
return $this->render('manage/accounts/transaction.html.twig', [
'companies' => $companies,
'userTransactions' => $userTransactions,
]);
}
#[Route('/edit/{id}', name: 'manage_account_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, UserCrms $companies, EntityManagerInterface $entityManager,ServiceStorage $serviceStorage): Response
{
$form = $this->createForm(ManageCompaniesForm::class, $companies);
$form->handleRequest($request);
$crm_img_path = $serviceStorage->getFileUrl($companies->getMediaId());
if ($form->isSubmitted() && $form->isValid()) {
$lifetime = $form->get('lifetime')->getData();
$import_csv = $form->get('import_csv')->getData();
$mass_email = $form->get('mass_email')->getData();
$csvEnable = $entityManager->getRepository(\App\Entity\CrmSettings::class)->findOneBy(['crmId'=>$companies->getCrmId(), 'name' => 'csv.enable']);
$massEmailEnable = $entityManager->getRepository(\App\Entity\CrmSettings::class)->findOneBy(['crmId'=>$companies->getCrmId(), 'name' => 'mass_email.enable']);
$lifetimeEnable = $entityManager->getRepository(\App\Entity\CrmSettings::class)->findOneBy(['crmId'=>$companies->getCrmId(), 'name' => 'lifetime.enable']);
if($csvEnable){
$csvEnable->setValue($import_csv);
$entityManager->persist($csvEnable);
$entityManager->flush();
}else{
$companySettings = new \App\Entity\CrmSettings();
$companySettings->setCrmId($companies->getCrmId());
$companySettings->setSection('csv.enable');
$companySettings->setName('csv.enable');
$companySettings->setValue($import_csv);
$entityManager->persist($companySettings);
$entityManager->flush();
}
if($massEmailEnable){
$massEmailEnable->setValue($mass_email);
$entityManager->persist($massEmailEnable);
$entityManager->flush();
}else{
$companySettings = new \App\Entity\CrmSettings();
$companySettings->setCrmId($companies->getCrmId());
$companySettings->setSection('mass_email.enable');
$companySettings->setName('mass_email.enable');
$companySettings->setValue($mass_email);
$entityManager->persist($companySettings);
$entityManager->flush();
}
if($lifetimeEnable){
$lifetimeEnable->setValue($lifetime);
$entityManager->persist($lifetimeEnable);
$entityManager->flush();
}else{
$companySettings = new \App\Entity\CrmSettings();
$companySettings->setCrmId($companies->getCrmId());
$companySettings->setSection('lifetime.enable');
$companySettings->setName('lifetime.enable');
$companySettings->setValue($lifetime);
$entityManager->persist($companySettings);
$entityManager->flush();
}
$entityManager->flush();
$this->addFlash('success', 'Update successfully.');
return $this->redirectToRoute('manage_account_details', ['id' => $companies->getCrmId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage/accounts/edit.html.twig', [
'companies' => $companies,
'form' => $form,
'crm_img_path' => $crm_img_path,
]);
}
#[Route('/recycle-bin/{id}', defaults: ['page' => '1'], name: 'manage_account_recycle_bin', methods: ['GET'])]
#[Route('/recycle-bin/{id}/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'manage_account_recycle_bin_paginated')]
#[Cache(smaxage: 10)]
public function recycleBin($id, $page, UserCrms $companies, TrashItemsRepository $trashItemsRepository, EntityManagerInterface $entityManager, Request $request): Response
{
$filter = $params = $request->query->all();
$restoreAllBtn = false;
if(isset($params['start_date']) && $params['start_date'] || isset($params['end_date']) && $params['end_date'] || !empty($params['user']) || !empty($params['enquiry_id']) || !empty($params['quote_id']) || !empty($params['job_id'])){
$restoreAllBtn = true;
}
$filterForm = $this->createForm(CrmRecycleBinFilter::class,$filter);
$data = $trashItemsRepository->adminPaginatorFetchAllByCrm($id, $page, $filter);
unset($params['_token']);
return $this->render('manage/accounts/recycle-bin.html.twig', [
'paginator' => $data,
'companies' => $companies,
'filter' => $filter,
'restoreAllBtn' => $restoreAllBtn,
'urlParams' => base64_encode(json_encode($params)),
'form' => $filterForm->createView()
]);
}
#[Route('/bulk-restore/{id}/{params?}', name: 'company_manage_bulk_restore', methods: ['POST','GET'])]
public function bulkRestore($id, $params, Request $request, UserCrms $companies, EntityManagerInterface $entityManager): Response
{
$filter = json_decode(base64_decode($params),true);
$start_at = (isset($filter['start_at']) && $filter['start_at']) ? date('Y-m-d 00:00:00', strtotime($filter['start_at'])) : date('Y-m-d 00:00:00',strtotime('01-01-2000'));
$end_at = (isset($filter['end_at']) && $filter['end_at']) ? date('Y-m-d 23:59:59',strtotime($filter['end_at'])) : date('Y-m-d 23:59:59');
if ($this->isCsrfTokenValid('restore'.$companies->getCrmId(), $request->request->get('_token'))) {
$trashItem = $entityManager->getRepository(\App\Entity\TrashItems::class)->createQueryBuilder('p')
->update()
->set('p.isRestoring', 1)
->andWhere("p.crmId = {$id}");
if (isset($filter['user']) && !empty($filter['user'])) {
$entityManager = $this->getEntityManager();
$user = $entityManager->getRepository(\App\Entity\User::class)->createQueryBuilder('u')
->add('select', 'u.userId')
->andWhere('u.name LIKE :name OR u.email LIKE :name')
->setParameter('name', '%'. $filter['user'] . '%')
->getQuery()->getResult();
$userIds = array();
if($user){
foreach($user as $user){
$userIds[] = $user['userId'];
}
}
if(count($userIds)){
$trashItem->andWhere("p.userId IN(:ids)")
->setParameter('ids', array_values($userIds));
}else{
$trashItem->andWhere("p.userId = :userId")
->setParameter('userId',0);
}
}
if (isset($filter['enquiry_id']) && !empty($filter['enquiry_id'])) {
$trashItem->andWhere('p.objectType = :type OR p.resourceType = :type')
->setParameter('type', 'enquiry')
->andWhere('p.objectId LIKE :id OR p.resourceId LIKE :id')
->setParameter('id', '%'. $filter['enquiry_id'] . '%');
}
if (isset($filter['quote_id']) && !empty($filter['quote_id'])) {
$trashItem->andWhere('p.objectType = :type OR p.resourceType = :type')
->setParameter('type', 'quote_outcome')
->andWhere('p.objectId LIKE :id OR p.resourceId LIKE :id')
->setParameter('id', '%'. $filter['quote_id'] . '%')
;
}
if (isset($filter['job_id']) && !empty($filter['job_id'])) {
$trashItem->andWhere('p.resourceId LIKE :id')
->setParameter('id', '%'. $filter['job_id'] . '%')
;
}
if($start_at || $end_at){
$trashItem->andwhere('p.createdAt BETWEEN :startAt AND :endAt')
->setParameter('startAt',$start_at)
->setParameter('endAt',$end_at);
}
$trashItem->getQuery()->execute();
$this->addFlash('success', 'Data restore starting.');
return $this->redirectToRoute('manage_account_recycle_bin', ['id'=> $companies->getCrmId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage/accounts/bulk-restore.html.twig', [
'companies' => $companies,
'start_at' => $start_at,
'end_at' => $end_at,
'params' => $params
]);
}
#[Route('/enquiry/{id}', defaults: ['page' => '1'], methods: ['GET'], name: 'enquiries_index')]
#[Route('/enquiry/{id}/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'enquiries_index_paginated')]
#[Cache(smaxage: 10)]
public function enquiriesIndex($id, UserCrms $companies, Request $request,int $page,EntityManagerInterface $entityManager,EnquiriesRepository $enquiriesRepository): Response
{
$params = $request->query->all();
$data = $enquiriesRepository->adminPaginatorFetchAll($id, $page, $params);
return $this->render('manage/accounts/enquiries-index.html.twig', [
'paginator' => $data,
'companies' => $companies,
]);
}
#[Route('/enquiry/customer-view/{id}', name: 'enquiries_customer_view', methods: ['GET'])]
public function view(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager): Response
{
return $this->render('manage/accounts/customer-view.html.twig', [
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/quote/{id}', name: 'quote_view', methods: ['GET'])]
public function viewQuote(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager,$id): Response
{
$crmEnquiryQuotes = $entityManager->getRepository(\App\Entity\CrmEnquiryQuotes::class)->findOneBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-quote-enquiry.html.twig', [
'quote' => $crmEnquiryQuotes,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/job/{id}', name: 'job_view', methods: ['GET'])]
public function viewJob(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager,$id): Response
{
$crmEnquiriesJobBooked = $entityManager->getRepository(\App\Entity\CrmEnquiriesJobBooked::class)->findBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-job-enquiry.html.twig', [
'job' => $crmEnquiriesJobBooked,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/priority/{id}', name: 'priority_view', methods: ['GET'])]
public function viewPriority(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager,$id): Response
{
$crmEnquiryPriorities = $entityManager->getRepository(\App\Entity\CrmEnquiryPriorities::class)->findBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-priority-enquiry.html.twig', [
'priority' => $crmEnquiryPriorities,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/payment/{id}', name: 'payment_view', methods: ['GET'])]
public function viewPayment(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager,$id): Response
{
$crmEnquiriesPaymentSchedule = $entityManager->getRepository(\App\Entity\CrmEnquiriesPaymentSchedule::class)->findBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-payment-enquiry.html.twig', [
'payment_schedule' => $crmEnquiriesPaymentSchedule,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/sms/{id}', name: 'sms_view', methods: ['GET'])]
public function viewSms($id, CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager): Response
{
$crmEnquiryScheduleSms = $entityManager->getRepository(\App\Entity\CrmEnquiryScheduleSms::class)->findBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-sms-enquiry.html.twig', [
'sms_data' => $crmEnquiryScheduleSms,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/email/{id}', name: 'email_view', methods: ['GET'])]
public function viewEmail($id, CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager, ServiceEnquiry $serviceEnquiry): Response
{
$listMailData =[];
$pendingMailLogs = [];
$mailLogs = [];
$crmId = $crmEnquiries->getCrmId();
$welcomeEmails = $entityManager->getRepository(\App\Entity\CrmEnquiryWelcomeMails::class)->findBy(array('crmId' => $crmId, 'enquiryId' => $id));
foreach($welcomeEmails as $item){
$mailTo ='';
$body = unserialize(base64_decode($item->getBody()),[]);
$emailTo = unserialize($item->getRecipientEmail(),[]);
if (is_string($emailTo)){
$mailTo = $emailTo;
}else{
$mailTo = implode(',',$emailTo);
}
$mailLogs[] = array(
'id' => $item->getId(),
'enquiryId' => $item->getEnquiryId(),
'settingId' => 0,
'sentDate' => $item->getSentDate(),
'date' => $item->getSentDate()->format('Y-m-d H:i:s'),
'time' => $item->getSentDate()->format('H:i:s'),
'type' => 'general',
'templateId' => $body['mail_template'],
'subject' => $body['mail_subject'],
'body' => str_replace(' ',' ',strip_tags($body['mail_body'])),
'emails' => $mailTo
);
}
$invoiceMails = $entityManager->getRepository(\App\Entity\CrmInvoiceMails::class)->findBy(array('crmId' => $crmId,'enquiryId' => $id));
foreach($invoiceMails as $item){
$body = unserialize(base64_decode($item->getBody()),[]);
$templateId = 0;
$responsible = '';
$passign = $entityManager->getRepository(\App\Entity\CrmEnquiriesPaymentAssigned::class)->findOneBy(array('scheduleId' => $item->getPaymentId()));
if($passign){
$responsible = $passign->getPaymentAssigned();
}
$responsible = $item->getUserId();
$invSubject = '';
$invBody = '';
if($item->getType() == 'invoice'){
if(isset($body['pdfData']['params']['reqData']['mail_data']['h_mail_template'])){
$templateId = $body['pdfData']['params']['reqData']['mail_data']['h_mail_template'];
$invSubject = $body['pdfData']['params']['reqData']['mail_data']['h_mail_subject'];
$invBody = $body['pdfData']['params']['reqData']['mail_data']['h_mail_body'];
}
$type = 'invoice';
}else{
if(isset($body['mail_data']['templateId'])){
$templateId = $body['mail_data']['templateId'];
$invSubject = $body['mail_data']['subject'];
$invBody = $body['mail_data']['body'];
}
$type = 'payment_receipt';
}
if(!empty($item->getSentDate())){
$emailTo = unserialize($item->getRecipientEmail(),[]);
$mailLogs[] = array(
'date' => $item->getSentDate(),
'time' => $item->getSentDate(),
'type' => $type,
'templateId' => $templateId,
'user_id' => $item->getUserId(),
'subject' => $invSubject,
'body' => str_replace(' ',' ',strip_tags($invBody)),
'emails' => implode(',',$emailTo)
);
}
}
$quoteMails = $entityManager->getRepository(\App\Entity\CrmEnquiryMails::class)->findBy(array('enquiryId' => $id));
foreach($quoteMails as $item){
$body = unserialize(base64_decode($item->getBody()),[]);
$templateId = 0;
$responsible = '';
if(isset($body['mail_data']['h_mail_template'])){
$templateId = $body['mail_data']['h_mail_template'];
}
if(isset($body['quoteResponsibleId'])){
$responsible = $body['quoteResponsibleId'];
}
$quote_user_id = '';
if(isset($body['items']['user_id'])){
$quote_user_id = $body['items']['user_id'];
}
$quote = $entityManager->getRepository(\App\Entity\CrmEnquiryQuotes::class)
->findOneBy(array('enquiryId' => $id, 'crmId' => $crmId));
$bodyContent = str_replace(' ',' ',strip_tags($body['mail_data']['h_mail_body']));
$bodyContent = str_replace('p {margin:0px;}', '', $bodyContent);
$bodyContent = str_replace(' ', ' ', $bodyContent);
$emailTo = unserialize($item->getRecipientEmail(),[]);
$mailLogs[] = array(
'date' => $item->getSentDate(),
'time' => $item->getSentDate(),
'type' => 'quote',
'templateId' => $templateId,
'templateTitle' => $serviceEnquiry->getTemplateNameById($templateId,$crmId),
'user_id' => $quote_user_id,
'subject' => $body['mail_data']['h_mail_subject'],
'body' => $bodyContent,
'emails' => implode(',',$emailTo)
);
}
$followupEmails = $entityManager->getRepository(\App\Entity\CrmEmailFollowup::class)->findBy(array('enquiryId' => $id));
foreach($followupEmails as $item){
$setting = $serviceEnquiry->getFollowupEmailSetting($item->getSettingId(),$crmId);
$followupSubject = '';
$followupBody = '';
if($setting){
//getbody
$crmFollowMailBody = $entityManager->getRepository(\App\Entity\SiteMailLogs::class)->findBy(array('crmId' => $crmId, 'templateId' => $setting->getTemplateId(), 'sourceId' => $item->getId()));
if(!$crmFollowMailBody){
$crmFollowMailTemplate = $entityManager->getRepository(\App\Entity\CrmMailTemplate::class)->findOneBy(array('crmId' => $crmId, 'id' => $setting->getTemplateId()));
$followupSubject = $crmFollowMailTemplate->getSubject();
$followupBody = $crmFollowMailTemplate->getBody();
}
}
$templateTitle = '';
if($setting){
$templateTitle = $serviceEnquiry->getTemplateNameById($setting->getTemplateId(),$crmId);
}
if($crmFollowMailBody){
foreach ($crmFollowMailBody as $mailBody) {
$body = unserialize(base64_decode($mailBody->getBody()))['body'];
$body = str_replace('p {margin:0px;}', '', $body);
$mailLogs[] = array(
'date' => $item->getSentDate(),
'time' => $item->getSentDate(),
'type' => 'follow-up',
'responsible' => '',
'templateId' => $setting ? $setting->getTemplateId() : 0,
'isExpired' => $item->getIsExpired(),
'subject' => $followupSubject,
'body' => str_replace(' ',' ',strip_tags($body)),
'templateTitle' => $templateTitle,
'emails' => ''
);
}
} else{
$mailLogs[] = array(
'date' => $item->getSentDate(),
'time' => $item->getSentDate(),
'type' => 'follow-up',
'responsible' => '',
'templateId' => $setting ? $setting->getTemplateId() : 0,
'isExpired' => $item->getIsExpired(),
'subject' => $followupSubject,
'body' => str_replace(' ',' ',strip_tags($followupBody)),
'templateTitle' => $templateTitle,
'emails' => ""
);
}
}
$jobEmails = $entityManager->getRepository(\App\Entity\CrmJobConfirmationMails::class)->findBy(array('enquiryId' => $id));
foreach($jobEmails as $item){
$body = unserialize(base64_decode($item->getBody()),[]);
$emailTo = unserialize($item->getRecipientEmail(),[]);
$mailLogs[] = array(
'date' => $item->getSentDate(),
'time' => $item->getSentDate(),
'type' => 'job',
'templateId' => $body['mail_template'],
'subject' => $body['mail_subject'],
'body' => str_replace(' ',' ',str_replace(' ',' ',strip_tags($body['mail_body']))),
'emails' => implode(',',$emailTo)
);
}
$listMailData = $mailLogs;
return $this->render('manage/accounts/view-email-enquiry.html.twig', [
'email_data' => $listMailData,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/job-summary/{id}', name: 'job_summary', methods: ['GET'])]
public function viewJobSummary(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager,$id): Response
{
$enquiryDescriptions = $entityManager->getRepository(\App\Entity\CrmEnquiryDescriptions::class)->findBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-job-summary.html.twig', [
'summary' => $enquiryDescriptions,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/payment-schedule/{id}', name: 'payment_schedule', methods: ['GET'])]
public function viewPaymentSchedule(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager,$id): Response
{
$paymentSchedule = $entityManager->getRepository(\App\Entity\CrmEnquiriesPaymentSchedule::class)->findBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-payment-schedule.html.twig', [
'payment_schedule' => $paymentSchedule,
'enquiries' => $crmEnquiries,
]);
}
#[Route('/enquiry/followup/{id}', name: 'followup_view', methods: ['GET'])]
public function viewFollowup(CrmEnquiries $crmEnquiries, EntityManagerInterface $entityManager,$id): Response
{
$crmFollowup = $entityManager->getRepository(\App\Entity\CrmFollowup::class)->findBy(array('enquiryId' => $id));
return $this->render('manage/accounts/view-followup-enquiry.html.twig', [
'followup' => $crmFollowup,
'enquiries' => $crmEnquiries,
]);
}
}