Skip to content

Commit

Permalink
Merge pull request mautic#2922 from mqueme/salesforce-companies
Browse files Browse the repository at this point in the history
Salesforce companies
  • Loading branch information
alanhartless authored Nov 24, 2016
2 parents 88a34d4 + cf3dbc9 commit 9ee6400
Show file tree
Hide file tree
Showing 20 changed files with 593 additions and 111 deletions.
2 changes: 1 addition & 1 deletion app/bundles/LeadBundle/Entity/CompanyLeadRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public function getCompaniesByLeadId($leadId, $companyId = null)
{
$q = $this->_em->getConnection()->createQueryBuilder();

$q->select('cl.company_id, comp.companyname, comp.companycity, comp.companycountry')
$q->select('cl.company_id, comp.companyname, comp.companycity, comp.companycountry, comp.companywebsite')
->from(MAUTIC_TABLE_PREFIX.'companies_leads', 'cl')
->join('cl', MAUTIC_TABLE_PREFIX.'companies', 'comp', 'comp.id = cl.company_id')
->where('cl.lead_id = :leadId')
Expand Down
95 changes: 69 additions & 26 deletions app/bundles/LeadBundle/Helper/IdentifyCompanyHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
namespace Mautic\LeadBundle\Helper;

use Mautic\CoreBundle\Factory\MauticFactory;
use Mautic\LeadBundle\Entity\Lead;
use Mautic\LeadBundle\Model\CompanyModel;

/**
Expand All @@ -35,70 +34,114 @@ public function __construct(MauticFactory $factory)

/**
* @param array $parameters
* @param Lead $lead
* @param mixed $lead
* @param CompanyModel $companyModel
*
* @return array
*/
public static function identifyLeadsCompany($parameters, Lead $lead, CompanyModel $companyModel)
public static function identifyLeadsCompany($parameters, $lead, CompanyModel $companyModel)
{
$companyName = $companyDomain = null;
$leadAdded = false;
$companyName = $companyDomain = null;
$leadAdded = false;
$companyEntity = null;

if (isset($parameters['company'])) {
$companyName = filter_var($parameters['company']);
} elseif (isset($parameters['email'])) {
$companyName = $companyDomain = self::domainExists($parameters['email']);
} elseif (isset($parameters['companyname'])) {
$companyName = filter_var($parameters['companyname']);
}

if ($companyName) {
$companyRepo = $companyModel->getRepository();
$filter['force'] = [
'column' => 'companyname',
'expr' => 'eq',
'value' => $companyName,
];

$city = isset($parameters['city']) ? $parameters['city'] : null;
$country = isset($parameters['country']) ? $parameters['country'] : null;
$state = isset($parameters['state']) ? $parameters['state'] : null;
self::setCompanyFilter('city', $parameters, $filter);
self::setCompanyFilter('state', $parameters, $filter);
self::setCompanyFilter('country', $parameters, $filter);

$company = $companyRepo->identifyCompany($companyName, $city, $country, $state);
$companyEntities = $companyModel->getEntities(
[
'limit' => 1,
'filter' => ['force' => [$filter['force']]],
'withTotalCount' => false,
]
);

if (!empty($company)) {
//check if lead is already assigned to company
$companyLeadRepo = $companyModel->getCompanyLeadRepository();
if (empty($companyLeadRepo->getCompaniesByLeadId($lead->getId(), $company['id']))) {
$leadAdded = true;
$company = [
'companyname' => $companyName,
'companywebsite' => $companyDomain,
'companycity' => $parameters['companycity'],
'companystate' => $parameters['companystate'],
'companycountry' => $parameters['companycountry'],
];

if (!empty($companyEntities)) {
foreach ($companyEntities as $entity) {
$companyEntity = $entity;
$companyLeadRepo = $companyModel->getCompanyLeadRepository();
if ($lead) {
$companyLead = $companyLeadRepo->getCompaniesByLeadId($lead->getId(), $entity->getId());
if (empty($companyLead)) {
$leadAdded = true;
}
}
$company['id'] = $entity->getId();
}
} else {
//create new company
$company = [
'companyname' => $companyName,
'companywebsite' => $companyDomain,
'companycity' => $city,
'companystate' => $state,
'companycountry' => $country,
];
$companyEntity = $companyModel->getEntity();
$companyModel->setFieldValues($companyEntity, $company, true);
$companyModel->saveEntity($companyEntity);
$company['id'] = $companyEntity->getId();
$leadAdded = true;
if ($lead) {
$leadAdded = true;
}
}

return [$company, $leadAdded];
return [$company, $leadAdded, $companyEntity];
}

return [null, false];
return [null, false, null];
}

/**
* @param $email
*
* @return mixed
*/
private function domainExists($email)
private static function domainExists($email)
{
list($user, $domain) = explode('@', $email);
$arr = dns_get_record($domain, DNS_MX);
if ($arr[0]['host'] == $domain && !empty($arr[0]['target'])) {
return $arr[0]['target'];
}
}

/**
* @param $field
* @param $parameters
* @param $filter
*/
private static function setCompanyFilter($field, &$parameters, &$filter)
{
if (isset($parameters[$field]) || isset($parameters['company'.$field])) {
if (!isset($parameters['company'.$field])) {
$parameters['company'.$field] = $parameters[$field];
}

$filter['force'][] = [
'column' => 'company'.$field,
'expr' => 'eq',
'value' => $parameters['company'.$field],
];
} else {
$parameters['company'.$field] = '';
}
}
}
31 changes: 31 additions & 0 deletions app/bundles/PluginBundle/Assets/js/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,37 @@ Mautic.getIntegrationLeadFields = function (integration, el, settings) {
);
};

Mautic.getIntegrationCompanyFields = function (integration, el, settings) {
Mautic.activateLabelLoadingIndicator(mQuery(el).attr('id'));

if (typeof settings == 'undefined') {
settings = {};
}

var data = {integration: integration, settings: settings};

mQuery('#companyFieldsContainer').html('');

Mautic.ajaxActionRequest('plugin:getIntegrationCompanyFields', data,
function(response) {
if (response.success) {
mQuery('#companyFieldsContainer').replaceWith(response.html);
Mautic.onPageLoad('#companyFieldsContainer');

if (mQuery('#company-fields-container').length) {
mQuery('#company-fields-container').removeClass('hide');
}
} else {
if (mQuery('#company-fields-container').length) {
mQuery('#company-fields-container').addClass('hide');
}
}
Mautic.removeLabelLoadingIndicator();
}
);
};


Mautic.getIntegrationConfig = function (el, settings) {
Mautic.activateLabelLoadingIndicator(mQuery(el).attr('id'));

Expand Down
24 changes: 19 additions & 5 deletions app/bundles/PluginBundle/Command/FetchLeadsCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,13 @@ protected function execute(InputInterface $input, OutputInterface $output)
$integrationHelper = $factory->getHelper('integration');

$integrationObject = $integrationHelper->getIntegrationObject($integration);
$config = $integrationObject->mergeConfigToFeatureSettings();

if ($integrationObject !== null && method_exists($integrationObject, 'getLeads')) {
$output->writeln('<info>'.$translator->trans('mautic.plugin.command.fetch.leads', ['%integration%' => $integration]).'</info>');

$params['start'] = $startDate;
$params['end'] = $endDate;
$params['start'] = $startDate;
$params['end'] = $endDate;

if ($integrationObject !== null && method_exists($integrationObject, 'getLeads') && in_array('Lead', $config['objects'])) {
$output->writeln('<info>'.$translator->trans('mautic.plugin.command.fetch.leads', ['%integration%' => $integration]).'</info>');
if (strtotime($startDate) > strtotime('-30 days')) {
$processed = intval($integrationObject->getLeads($params));

Expand All @@ -107,6 +107,20 @@ protected function execute(InputInterface $input, OutputInterface $output)
$output->writeln('<error>'.$translator->trans('mautic.plugin.command.fetch.leads.wrong.date').'</error>');
}
}

if ($integrationObject !== null && method_exists($integrationObject, 'getCompanies') && in_array('company', $config['objects'])) {
$output->writeln('<info>'.$translator->trans('mautic.plugin.command.fetch.companies', ['%integration%' => $integration]).'</info>');

if (strtotime($startDate) > strtotime('-30 days')) {
$processed = intval($integrationObject->getCompanies($params));

$output->writeln('<comment>'.$translator->trans('mautic.plugin.command.fetch.companies.starting').'</comment>');

$output->writeln('<comment>'.$translator->trans('mautic.plugin.command.fetch.companies.events_executed', ['%events%' => $processed]).'</comment>'."\n");
} else {
$output->writeln('<error>'.$translator->trans('mautic.plugin.command.fetch.leads.wrong.date').'</error>');
}
}
}

return 0;
Expand Down
4 changes: 4 additions & 0 deletions app/bundles/PluginBundle/Config/config.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@
'class' => 'Mautic\PluginBundle\Form\Type\FieldsType',
'alias' => 'integration_fields',
],
'mautic.form.type.integration.company.fields' => [
'class' => 'Mautic\PluginBundle\Form\Type\CompanyFieldsType',
'alias' => 'integration_company_fields',
],
'mautic.form.type.integration.keys' => [
'class' => 'Mautic\PluginBundle\Form\Type\KeysType',
'alias' => 'integration_keys',
Expand Down
71 changes: 71 additions & 0 deletions app/bundles/PluginBundle/Controller/AjaxController.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,77 @@ protected function getIntegrationLeadFieldsAction(Request $request)
return $this->sendJsonResponse($dataArray);
}

/**
* Get the HTML for list of fields.
*
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\JsonResponse
*/
protected function getIntegrationCompanyFieldsAction(Request $request)
{
$integration = $request->request->get('integration');
$settings = $request->request->get('settings');

$dataArray = ['success' => 0];

if (!empty($integration) && !empty($settings)) {
/** @var \Mautic\PluginBundle\Helper\IntegrationHelper $helper */
$helper = $this->get('mautic.helper.integration');
/** @var \Mautic\PluginBundle\Integration\AbstractIntegration $object */
$object = $helper->getIntegrationObject($integration);

if ($object) {
$integrationFields = $object->getCompanyLeadFields($settings);

if (!empty($integrationFields)) {
// Get a list of custom form fields
$defaults = $object->getIntegrationSettings()->getFeatureSettings();
$companyFields = $this->getModel('plugin')->getCompanyFields($defaults);
list($specialInstructions, $alertType) = $object->getFormNotes('companyfield_match');
$data = isset($defaults['companyFields']) ? $defaults['companyFields'] : [];

$form = $this->createForm('integration_company_fields', $data, [
'company_fields' => $companyFields,
'integration_company_fields' => $integrationFields,
'csrf_protection' => false,
'special_instructions' => $specialInstructions,
'alert_type' => $alertType,
]);

$form = $this->setFormTheme($form, 'MauticCoreBundle:Helper:blank_form.html.php', 'MauticPluginBundle:FormTheme\Integration');

$html = $this->render('MauticCoreBundle:Helper:blank_form.html.php', [
'form' => $form,
'function' => 'row',
'variables' => [
'integration' => $object,
],
])->getContent();

if (!isset($settings['prefix'])) {
$prefix = 'integration_details[featureSettings][companyFields]';
} else {
$prefix = $settings['prefix'];
}

$idPrefix = str_replace(['][', '[', ']'], '_', $prefix);
if (substr($idPrefix, -1) == '_') {
$idPrefix = substr($idPrefix, 0, -1);
}

$html = preg_replace('/integration_fields\[(.*?)\]/', $prefix.'[$1]', $html);
$html = str_replace('integration_fields', $idPrefix, $html);

$dataArray['success'] = 1;
$dataArray['html'] = $html;
}
}
}

return $this->sendJsonResponse($dataArray);
}

/**
* Get the HTML for integration properties.
*
Expand Down
6 changes: 5 additions & 1 deletion app/bundles/PluginBundle/Controller/PluginController.php
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,10 @@ public function configAction($name)
throw $this->createNotFoundException($this->get('translator')->trans('mautic.core.url.error.404'));
}

$leadFields = $this->getModel('plugin')->getLeadFields();
$pluginModel = $this->getModel('plugin');

$leadFields = $pluginModel->getLeadFields();
$companyFields = $pluginModel->getCompanyFields();

/** @var \Mautic\PluginBundle\Integration\AbstractIntegration $integrationObject */
$entity = $integrationObject->getIntegrationSettings();
Expand All @@ -166,6 +169,7 @@ public function configAction($name)
[
'integration' => $entity->getName(),
'lead_fields' => $leadFields,
'company_fields' => $companyFields,
'integration_object' => $integrationObject,
'action' => $this->generateUrl('mautic_plugin_config', ['name' => $name]),
]
Expand Down
Loading

0 comments on commit 9ee6400

Please sign in to comment.