Issues (3627)

LeadBundle/Helper/IdentifyCompanyHelper.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   2014 Mautic Contributors. All rights reserved
5
 * @author      Mautic
6
 *
7
 * @link        http://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\LeadBundle\Helper;
13
14
use Mautic\LeadBundle\Entity\Company;
15
use Mautic\LeadBundle\Model\CompanyModel;
16
17
/**
18
 * Class IdentifyCompanyHelper.
19
 */
20
class IdentifyCompanyHelper
21
{
22
    /**
23
     * @param array $parameters
24
     * @param mixed $lead
25
     *
26
     * @return array
27
     */
28
    public static function identifyLeadsCompany($parameters, $lead, CompanyModel $companyModel)
29
    {
30
        list($company, $companyEntities) = self::findCompany($parameters, $companyModel);
31
        if (!empty($company)) {
32
            $leadAdded = false;
33
            if (count($companyEntities)) {
34
                foreach ($companyEntities as $entity) {
35
                    $companyEntity   = $entity;
36
                    $companyLeadRepo = $companyModel->getCompanyLeadRepository();
37
                    if ($lead) {
38
                        $companyLead = $companyLeadRepo->getCompaniesByLeadId($lead->getId(), $entity->getId());
39
                        if (empty($companyLead)) {
40
                            $leadAdded = true;
41
                        }
42
                    }
43
                }
44
            } else {
45
                //create new company
46
                $companyEntity = new Company();
47
                $companyModel->setFieldValues($companyEntity, $company, true);
48
                $companyModel->saveEntity($companyEntity);
49
                $company['id'] = $companyEntity->getId();
50
                if ($lead) {
51
                    $leadAdded = true;
52
                }
53
            }
54
55
            return [$company, $leadAdded, $companyEntity];
56
        }
57
58
        return [null, false, null];
59
    }
60
61
    /**
62
     * @return array
63
     */
64
    public static function findCompany(array $parameters, CompanyModel $companyModel)
65
    {
66
        $companyName   = null;
67
        $companyDomain = null;
68
        $companyEntity = null;
0 ignored issues
show
The assignment to $companyEntity is dead and can be removed.
Loading history...
69
70
        if (isset($parameters['company'])) {
71
            $companyName = filter_var($parameters['company']);
72
        } elseif (isset($parameters['companyname'])) {
73
            $companyName = filter_var($parameters['companyname']);
74
        }
75
76
        if (isset($parameters['email']) || isset($parameters['companyemail'])) {
77
            $companyDomain = isset($parameters['email']) ? self::domainExists($parameters['email']) : self::domainExists($parameters['companyemail']);
78
        }
79
80
        if (empty($parameters['companywebsite']) && !empty($parameters['companyemail'])) {
81
            $companyDomain = self::domainExists($parameters['companyemail']);
82
        }
83
84
        if ($companyName) {
85
            $filter['force'] = [
86
                'column' => 'companyname',
87
                'expr'   => 'eq',
88
                'value'  => $companyName,
89
            ];
90
91
            self::setCompanyFilter('city', $parameters, $filter);
92
            self::setCompanyFilter('state', $parameters, $filter);
93
            self::setCompanyFilter('country', $parameters, $filter);
94
95
            $companyEntities = $companyModel->getEntities(
96
                [
97
                    'limit'          => 1,
98
                    'filter'         => ['force' => [$filter['force']]],
99
                    'withTotalCount' => false,
100
                ]
101
            );
102
103
            $company = array_merge([
104
                'companyname'    => $companyName,
105
                'companywebsite' => $companyDomain,
106
            ], $parameters);
107
108
            if (1 === count($companyEntities)) {
109
                end($companyEntities);
110
                $key           = key($companyEntities);
111
                $company['id'] = $companyEntities[$key]->getId();
112
            }
113
114
            return [$company, $companyEntities];
115
        }
116
117
        return [[], []];
118
    }
119
120
    /**
121
     * Checks if email address' domain has a DNS MX record. Returns the domain if found.
122
     *
123
     * @param string $email
124
     *
125
     * @return string|false
126
     */
127
    protected static function domainExists($email)
128
    {
129
        if (!strstr($email, '@')) { //not a valid email adress
130
            return false;
131
        }
132
133
        list($user, $domain) = explode('@', $email);
134
        $arr                 = dns_get_record($domain, DNS_MX);
135
136
        if (empty($arr)) {
137
            return false;
138
        }
139
140
        if ($arr[0]['host'] === $domain) {
141
            return $domain;
142
        }
143
144
        return false;
145
    }
146
147
    /**
148
     * @param string $field
149
     */
150
    private static function setCompanyFilter($field, array &$parameters, array &$filter)
151
    {
152
        if (isset($parameters[$field]) || isset($parameters['company'.$field])) {
153
            if (!isset($parameters['company'.$field])) {
154
                $parameters['company'.$field] = $parameters[$field];
155
            }
156
157
            $filter['force'][] = [
158
                'column' => 'company'.$field,
159
                'expr'   => 'eq',
160
                'value'  => $parameters['company'.$field],
161
            ];
162
        } else {
163
            $parameters['company'.$field] = '';
164
        }
165
    }
166
}
167