Spaces:
No application file
No application file
namespace MauticPlugin\MauticClearbitBundle\Controller; | |
use Mautic\FormBundle\Controller\FormController; | |
use Mautic\LeadBundle\Entity\Company; | |
use Mautic\LeadBundle\Entity\Lead; | |
use MauticPlugin\MauticClearbitBundle\Form\Type\BatchLookupType; | |
use MauticPlugin\MauticClearbitBundle\Form\Type\LookupType; | |
use MauticPlugin\MauticClearbitBundle\Helper\LookupHelper; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
class ClearbitController extends FormController | |
{ | |
/** | |
* @param string $objectId | |
* | |
* @return JsonResponse | |
* | |
* @throws \InvalidArgumentException | |
*/ | |
public function lookupPersonAction(Request $request, LookupHelper $lookupHelper, $objectId = '') | |
{ | |
if ('POST' === $request->getMethod()) { | |
$data = $request->request->all()['clearbit_lookup'] ?? []; | |
$objectId = $data['objectId']; | |
} | |
/** @var \Mautic\LeadBundle\Model\LeadModel $model */ | |
$model = $this->getModel('lead'); | |
$lead = $model->getEntity($objectId); | |
if (!$this->security->hasEntityAccess( | |
'lead:leads:editown', | |
'lead:leads:editother', | |
$lead->getPermissionUser() | |
) | |
) { | |
$this->addFlashMessage( | |
$this->translator->trans('mautic.plugin.clearbit.forbidden'), | |
[], | |
'error' | |
); | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
if ('GET' === $request->getMethod()) { | |
$route = $this->generateUrl( | |
'mautic_plugin_clearbit_action', | |
[ | |
'objectAction' => 'lookupPerson', | |
] | |
); | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'form' => $this->createForm( | |
LookupType::class, | |
[ | |
'objectId' => $objectId, | |
], | |
[ | |
'action' => $route, | |
] | |
)->createView(), | |
'lookupItem' => $lead->getEmail(), | |
], | |
'contentTemplate' => '@MauticClearbit/Clearbit/lookup.html.twig', | |
'passthroughVars' => [ | |
'activeLink' => '#mautic_contact_index', | |
'mauticContent' => 'lead', | |
'route' => $route, | |
], | |
] | |
); | |
} else { | |
if ('POST' === $request->getMethod()) { | |
try { | |
$lookupHelper->lookupContact($lead, array_key_exists('notify', $data)); | |
$this->addFlashMessage( | |
'mautic.lead.batch_leads_affected', | |
[ | |
'%count%' => 1, | |
] | |
); | |
} catch (\Exception $ex) { | |
$this->addFlashMessage( | |
$ex->getMessage(), | |
[], | |
'error' | |
); | |
} | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
} | |
return new Response('Bad Request', 400); | |
} | |
/** | |
* @return JsonResponse | |
* | |
* @throws \InvalidArgumentException | |
*/ | |
public function batchLookupPersonAction(Request $request, LookupHelper $lookupHelper) | |
{ | |
/** @var \Mautic\LeadBundle\Model\LeadModel $model */ | |
$model = $this->getModel('lead'); | |
if ('GET' === $request->getMethod()) { | |
$data = $request->query->all()['clearbit_batch_lookup'] ?? []; | |
} else { | |
$data = $request->request->all()['clearbit_batch_lookup'] ?? []; | |
} | |
$entities = []; | |
if (array_key_exists('ids', $data)) { | |
$ids = $data['ids']; | |
if (!is_array($ids)) { | |
$ids = json_decode($ids, true); | |
} | |
if (is_array($ids) && count($ids)) { | |
$entities = $model->getEntities( | |
[ | |
'filter' => [ | |
'force' => [ | |
[ | |
'column' => 'l.id', | |
'expr' => 'in', | |
'value' => $ids, | |
], | |
], | |
], | |
'ignore_paginator' => true, | |
] | |
); | |
} | |
} | |
$lookupEmails = []; | |
if ($count = count($entities)) { | |
/** @var Lead $lead */ | |
foreach ($entities as $lead) { | |
if ($this->security->hasEntityAccess( | |
'lead:leads:editown', | |
'lead:leads:editother', | |
$lead->getPermissionUser() | |
) | |
&& $lead->getEmail() | |
) { | |
$lookupEmails[$lead->getId()] = $lead->getEmail(); | |
} | |
} | |
$count = count($lookupEmails); | |
} | |
if (0 === $count) { | |
$this->addFlashMessage( | |
$this->translator->trans('mautic.plugin.clearbit.empty'), | |
[], | |
'error' | |
); | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} else { | |
if ($count > 20) { | |
$this->addFlashMessage( | |
$this->translator->trans('mautic.plugin.clearbit.toomany'), | |
[], | |
'error' | |
); | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
} | |
if ('GET' === $request->getMethod()) { | |
$route = $this->generateUrl( | |
'mautic_plugin_clearbit_action', | |
[ | |
'objectAction' => 'batchLookupPerson', | |
] | |
); | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'form' => $this->createForm( | |
BatchLookupType::class, | |
[], | |
[ | |
'action' => $route, | |
] | |
)->createView(), | |
'lookupItems' => array_values($lookupEmails), | |
], | |
'contentTemplate' => '@MauticClearbit/Clearbit/batchLookup.html.twig', | |
'passthroughVars' => [ | |
'activeLink' => '#mautic_contact_index', | |
'mauticContent' => 'leadBatch', | |
'route' => $route, | |
], | |
] | |
); | |
} else { | |
if ('POST' === $request->getMethod()) { | |
$notify = array_key_exists('notify', $data); | |
foreach ($lookupEmails as $id => $lookupEmail) { | |
if ($lead = $model->getEntity($id)) { | |
try { | |
$lookupHelper->lookupContact($lead, $notify); | |
} catch (\Exception $ex) { | |
$this->addFlashMessage( | |
$ex->getMessage(), | |
[], | |
'error' | |
); | |
--$count; | |
} | |
} | |
} | |
if ($count) { | |
$this->addFlashMessage( | |
'mautic.lead.batch_leads_affected', | |
[ | |
'%count%' => $count, | |
] | |
); | |
} | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
} | |
return new Response('Bad Request', 400); | |
} | |
/***************** COMPANY ***********************/ | |
/** | |
* @param string $objectId | |
* | |
* @return JsonResponse | |
* | |
* @throws \InvalidArgumentException | |
*/ | |
public function lookupCompanyAction(Request $request, LookupHelper $lookupHelper, $objectId = '') | |
{ | |
if ('POST' === $request->getMethod()) { | |
$data = $request->request->all()['clearbit_lookup'] ?? []; | |
$objectId = $data['objectId']; | |
} | |
/** @var \Mautic\LeadBundle\Model\CompanyModel $model */ | |
$model = $this->getModel('lead.company'); | |
/** @var Company $company */ | |
$company = $model->getEntity($objectId); | |
if ('GET' === $request->getMethod()) { | |
$route = $this->generateUrl( | |
'mautic_plugin_clearbit_action', | |
[ | |
'objectAction' => 'lookupCompany', | |
] | |
); | |
$website = $company->getFieldValue('companywebsite'); | |
if (!$website) { | |
$this->addFlashMessage( | |
$this->translator->trans('mautic.plugin.clearbit.compempty'), | |
[], | |
'error' | |
); | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
$parse = parse_url($website); | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'form' => $this->createForm( | |
LookupType::class, | |
[ | |
'objectId' => $objectId, | |
], | |
[ | |
'action' => $route, | |
] | |
)->createView(), | |
'lookupItem' => $parse['host'], | |
], | |
'contentTemplate' => '@MauticClearbit/Clearbit/lookup.html.twig', | |
'passthroughVars' => [ | |
'activeLink' => '#mautic_company_index', | |
'mauticContent' => 'company', | |
'route' => $route, | |
], | |
] | |
); | |
} else { | |
if ('POST' === $request->getMethod()) { | |
try { | |
$lookupHelper->lookupCompany($company, array_key_exists('notify', $data)); | |
$this->addFlashMessage( | |
'mautic.company.batch_companies_affected', | |
[ | |
'%count%' => 1, | |
] | |
); | |
} catch (\Exception $ex) { | |
$this->addFlashMessage( | |
$ex->getMessage(), | |
[], | |
'error' | |
); | |
} | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
} | |
return new Response('Bad Request', 400); | |
} | |
/** | |
* @return JsonResponse | |
* | |
* @throws \InvalidArgumentException | |
*/ | |
public function batchLookupCompanyAction(Request $request, LookupHelper $lookupHelper) | |
{ | |
/** @var \Mautic\LeadBundle\Model\CompanyModel $model */ | |
$model = $this->getModel('lead.company'); | |
if ('GET' === $request->getMethod()) { | |
$data = $request->query->all()['clearbit_batch_lookup'] ?? []; | |
} else { | |
$data = $request->request->all()['clearbit_batch_lookup'] ?? []; | |
} | |
$entities = []; | |
if (array_key_exists('ids', $data)) { | |
$ids = $data['ids']; | |
if (!is_array($ids)) { | |
$ids = json_decode($ids, true); | |
} | |
if (is_array($ids) && count($ids)) { | |
$entities = $model->getEntities( | |
[ | |
'filter' => [ | |
'force' => [ | |
[ | |
'column' => 'comp.id', | |
'expr' => 'in', | |
'value' => $ids, | |
], | |
], | |
], | |
'ignore_paginator' => true, | |
] | |
); | |
} | |
} | |
$lookupWebsites = []; | |
if ($count = count($entities)) { | |
/** @var Company $company */ | |
foreach ($entities as $company) { | |
if ($company->getFieldValue('companywebsite')) { | |
$website = $company->getFieldValue('companywebsite'); | |
$parse = parse_url($website); | |
if (!isset($parse['host'])) { | |
continue; | |
} | |
$lookupWebsites[$company->getId()] = $parse['host']; | |
} | |
} | |
$count = count($lookupWebsites); | |
} | |
if (0 === $count) { | |
$this->addFlashMessage( | |
$this->translator->trans('mautic.plugin.clearbit.compempty'), | |
[], | |
'error' | |
); | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} else { | |
if ($count > 20) { | |
$this->addFlashMessage( | |
$this->translator->trans('mautic.plugin.clearbit.comptoomany'), | |
[], | |
'error' | |
); | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
} | |
if ('GET' === $request->getMethod()) { | |
$route = $this->generateUrl( | |
'mautic_plugin_clearbit_action', | |
[ | |
'objectAction' => 'batchLookupCompany', | |
] | |
); | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'form' => $this->createForm( | |
BatchLookupType::class, | |
[], | |
[ | |
'action' => $route, | |
] | |
)->createView(), | |
'lookupItems' => array_values($lookupWebsites), | |
], | |
'contentTemplate' => '@MauticClearbit/Clearbit/batchLookup.html.twig', | |
'passthroughVars' => [ | |
'activeLink' => '#mautic_company_index', | |
'mauticContent' => 'companyBatch', | |
'route' => $route, | |
], | |
] | |
); | |
} else { | |
if ('POST' === $request->getMethod()) { | |
$notify = array_key_exists('notify', $data); | |
foreach ($lookupWebsites as $id => $lookupWebsite) { | |
if ($company = $model->getEntity($id)) { | |
try { | |
$lookupHelper->lookupCompany($company, $notify); | |
} catch (\Exception $ex) { | |
$this->addFlashMessage( | |
$ex->getMessage(), | |
[], | |
'error' | |
); | |
--$count; | |
} | |
} | |
} | |
if ($count) { | |
$this->addFlashMessage( | |
'mautic.company.batch_companies_affected', | |
[ | |
'%count%' => $count, | |
] | |
); | |
} | |
return new JsonResponse( | |
[ | |
'closeModal' => true, | |
'flashes' => $this->getFlashContent(), | |
] | |
); | |
} | |
} | |
return new Response('Bad Request', 400); | |
} | |
} | |