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\Controller; |
||||||
13 | |||||||
14 | use Mautic\CampaignBundle\Membership\MembershipManager; |
||||||
15 | use Mautic\CampaignBundle\Model\CampaignModel; |
||||||
16 | use Mautic\CoreBundle\Controller\AjaxController as CommonAjaxController; |
||||||
17 | use Mautic\CoreBundle\Controller\AjaxLookupControllerTrait; |
||||||
18 | use Mautic\CoreBundle\Helper\InputHelper; |
||||||
19 | use Mautic\LeadBundle\Entity\DoNotContact; |
||||||
20 | use Mautic\LeadBundle\Entity\UtmTag; |
||||||
21 | use Mautic\LeadBundle\Event\LeadTimelineEvent; |
||||||
22 | use Mautic\LeadBundle\Helper\FormFieldHelper; |
||||||
23 | use Mautic\LeadBundle\LeadEvents; |
||||||
24 | use Mautic\LeadBundle\Model\DoNotContact as DoNotContactModel; |
||||||
25 | use Mautic\LeadBundle\Segment\Stat\SegmentCampaignShare; |
||||||
26 | use Mautic\PluginBundle\Helper\IntegrationHelper; |
||||||
27 | use Symfony\Component\HttpFoundation\JsonResponse; |
||||||
28 | use Symfony\Component\HttpFoundation\Request; |
||||||
29 | |||||||
30 | class AjaxController extends CommonAjaxController |
||||||
31 | { |
||||||
32 | use AjaxLookupControllerTrait; |
||||||
33 | |||||||
34 | /** |
||||||
35 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
36 | */ |
||||||
37 | protected function userListAction(Request $request) |
||||||
38 | { |
||||||
39 | $filter = InputHelper::clean($request->query->get('filter')); |
||||||
40 | $results = $this->getModel('lead.lead')->getLookupResults('user', $filter); |
||||||
41 | $dataArray = []; |
||||||
42 | foreach ($results as $r) { |
||||||
43 | $name = $r['firstName'].' '.$r['lastName']; |
||||||
44 | $dataArray[] = [ |
||||||
45 | 'label' => $name, |
||||||
46 | 'value' => $r['id'], |
||||||
47 | ]; |
||||||
48 | } |
||||||
49 | |||||||
50 | return $this->sendJsonResponse($dataArray); |
||||||
51 | } |
||||||
52 | |||||||
53 | /** |
||||||
54 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
55 | */ |
||||||
56 | protected function getLeadIdsByFieldValueAction(Request $request) |
||||||
57 | { |
||||||
58 | $field = InputHelper::clean($request->request->get('field')); |
||||||
59 | $value = InputHelper::clean($request->request->get('value')); |
||||||
60 | $ignore = (int) $request->request->get('ignore'); |
||||||
61 | $dataArray = ['items' => []]; |
||||||
62 | |||||||
63 | if ($field && $value) { |
||||||
64 | $repo = $this->getModel('lead.lead')->getRepository(); |
||||||
65 | $leads = $repo->getLeadsByFieldValue($field, $value, $ignore); |
||||||
66 | $dataArray['existsMessage'] = $this->translator->trans('mautic.lead.exists.by.field').': '; |
||||||
67 | |||||||
68 | foreach ($leads as $lead) { |
||||||
69 | $fields = $repo->getFieldValues($lead->getId()); |
||||||
70 | $lead->setFields($fields); |
||||||
71 | $name = $lead->getName(); |
||||||
72 | |||||||
73 | if (!$name) { |
||||||
74 | $name = $lead->getEmail(); |
||||||
75 | } |
||||||
76 | |||||||
77 | if (!$name) { |
||||||
78 | $name = $this->translator->trans('mautic.lead.lead.anonymous'); |
||||||
79 | } |
||||||
80 | |||||||
81 | $leadLink = $this->generateUrl('mautic_contact_action', ['objectAction' => 'view', 'objectId' => $lead->getId()]); |
||||||
82 | |||||||
83 | $dataArray['items'][] = [ |
||||||
84 | 'name' => $name, |
||||||
85 | 'id' => $lead->getId(), |
||||||
86 | 'link' => $leadLink, |
||||||
87 | ]; |
||||||
88 | } |
||||||
89 | } |
||||||
90 | |||||||
91 | return $this->sendJsonResponse($dataArray); |
||||||
92 | } |
||||||
93 | |||||||
94 | /** |
||||||
95 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
96 | */ |
||||||
97 | protected function fieldListAction(Request $request) |
||||||
98 | { |
||||||
99 | $dataArray = ['success' => 1]; |
||||||
100 | $filter = InputHelper::clean($request->query->get('filter')); |
||||||
101 | $fieldAlias = InputHelper::alphanum($request->query->get('field'), false, false, ['_']); |
||||||
102 | $fieldModel = $this->getModel('lead.field'); |
||||||
103 | |||||||
104 | if (empty($fieldAlias)) { |
||||||
105 | $dataArray['error'] = 'Alias cannot be empty'; |
||||||
106 | $dataArray['success'] = 0; |
||||||
107 | |||||||
108 | return $this->sendJsonResponse($dataArray); |
||||||
109 | } |
||||||
110 | |||||||
111 | if ('owner_id' === $fieldAlias) { |
||||||
112 | $results = $this->getModel('lead.lead')->getLookupResults('user', $filter); |
||||||
113 | foreach ($results as $r) { |
||||||
114 | $name = $r['firstName'].' '.$r['lastName']; |
||||||
115 | $dataArray[] = [ |
||||||
116 | 'value' => $name, |
||||||
117 | 'id' => $r['id'], |
||||||
118 | ]; |
||||||
119 | } |
||||||
120 | |||||||
121 | return $this->sendJsonResponse($dataArray); |
||||||
122 | } |
||||||
123 | |||||||
124 | $field = $fieldModel->getEntityByAlias($fieldAlias); |
||||||
125 | $isBehavior = empty($field); |
||||||
126 | |||||||
127 | if ($isBehavior) { |
||||||
128 | return $this->sendJsonResponse($dataArray); |
||||||
129 | } |
||||||
130 | |||||||
131 | // Selet field types that make sense to provide typeahead for. |
||||||
132 | $isLookup = in_array($field->getType(), ['lookup']); |
||||||
133 | $shouldLookup = in_array($field->getAlias(), ['city', 'company', 'title']); |
||||||
134 | |||||||
135 | if (!$isLookup && !$shouldLookup) { |
||||||
136 | return $this->sendJsonResponse($dataArray); |
||||||
137 | } |
||||||
138 | |||||||
139 | if ('company' === $field->getObject()) { |
||||||
140 | $results = $this->getModel('lead.company')->getLookupResults('companyfield', [$fieldAlias, $filter]); |
||||||
141 | foreach ($results as $r) { |
||||||
142 | $dataArray[] = ['value' => $r['label']]; |
||||||
143 | } |
||||||
144 | } elseif ('lead' === $field->getObject()) { |
||||||
145 | $results = $fieldModel->getLookupResults($fieldAlias, $filter); |
||||||
146 | foreach ($results as $r) { |
||||||
147 | $dataArray[] = ['value' => $r[$fieldAlias]]; |
||||||
148 | } |
||||||
149 | } |
||||||
150 | |||||||
151 | return $this->sendJsonResponse($dataArray); |
||||||
152 | } |
||||||
153 | |||||||
154 | /** |
||||||
155 | * Updates the cache and gets returns updated HTML. |
||||||
156 | * |
||||||
157 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
158 | */ |
||||||
159 | protected function updateSocialProfileAction(Request $request) |
||||||
160 | { |
||||||
161 | $dataArray = ['success' => 0]; |
||||||
162 | $network = InputHelper::clean($request->request->get('network')); |
||||||
163 | $leadId = InputHelper::clean($request->request->get('lead')); |
||||||
164 | |||||||
165 | if (!empty($leadId)) { |
||||||
166 | //find the lead |
||||||
167 | $model = $this->getModel('lead.lead'); |
||||||
168 | $lead = $model->getEntity($leadId); |
||||||
169 | |||||||
170 | if (null !== $lead && $this->get('mautic.security')->hasEntityAccess('lead:leads:editown', 'lead:leads:editown', $lead->getPermissionUser())) { |
||||||
171 | $leadFields = $lead->getFields(); |
||||||
172 | /** @var IntegrationHelper $integrationHelper */ |
||||||
173 | $integrationHelper = $this->factory->getHelper('integration'); |
||||||
174 | $socialProfiles = $integrationHelper->getUserProfiles($lead, $leadFields, true, $network); |
||||||
175 | $socialProfileUrls = $integrationHelper->getSocialProfileUrlRegex(false); |
||||||
176 | $integrations = []; |
||||||
177 | $socialCount = count($socialProfiles); |
||||||
178 | if (empty($network) || empty($socialCount)) { |
||||||
179 | $dataArray['completeProfile'] = $this->renderView( |
||||||
180 | 'MauticLeadBundle:Social:index.html.php', |
||||||
181 | [ |
||||||
182 | 'socialProfiles' => $socialProfiles, |
||||||
183 | 'lead' => $lead, |
||||||
184 | 'socialProfileUrls' => $socialProfileUrls, |
||||||
185 | ] |
||||||
186 | ); |
||||||
187 | $dataArray['socialCount'] = $socialCount; |
||||||
188 | } else { |
||||||
189 | foreach ($socialProfiles as $name => $details) { |
||||||
190 | if ($integrationObject = $integrationHelper->getIntegrationObject($name)) { |
||||||
191 | if ($template = $integrationObject->getSocialProfileTemplate()) { |
||||||
192 | $integrations[$name]['newContent'] = $this->renderView( |
||||||
193 | $template, |
||||||
194 | [ |
||||||
195 | 'lead' => $lead, |
||||||
196 | 'details' => $details, |
||||||
197 | 'integrationName' => $name, |
||||||
198 | 'socialProfileUrls' => $socialProfileUrls, |
||||||
199 | ] |
||||||
200 | ); |
||||||
201 | } |
||||||
202 | } |
||||||
203 | } |
||||||
204 | $dataArray['profiles'] = $integrations; |
||||||
205 | } |
||||||
206 | |||||||
207 | $dataArray['success'] = 1; |
||||||
208 | } |
||||||
209 | } |
||||||
210 | |||||||
211 | return $this->sendJsonResponse($dataArray); |
||||||
212 | } |
||||||
213 | |||||||
214 | /** |
||||||
215 | * Clears the cache for a network. |
||||||
216 | * |
||||||
217 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
218 | */ |
||||||
219 | protected function clearSocialProfileAction(Request $request) |
||||||
220 | { |
||||||
221 | $dataArray = ['success' => 0]; |
||||||
222 | $network = InputHelper::clean($request->request->get('network')); |
||||||
223 | $leadId = InputHelper::clean($request->request->get('lead')); |
||||||
224 | |||||||
225 | if (!empty($leadId)) { |
||||||
226 | //find the lead |
||||||
227 | $model = $this->getModel('lead.lead'); |
||||||
228 | $lead = $model->getEntity($leadId); |
||||||
229 | |||||||
230 | if (null !== $lead && $this->get('mautic.security')->hasEntityAccess('lead:leads:editown', 'lead:leads:editown', $lead->getPermissionUser())) { |
||||||
231 | $dataArray['success'] = 1; |
||||||
232 | /** @var \Mautic\PluginBundle\Helper\IntegrationHelper $helper */ |
||||||
233 | $helper = $this->factory->getHelper('integration'); |
||||||
234 | $socialProfiles = $helper->clearIntegrationCache($lead, $network); |
||||||
235 | $socialCount = count($socialProfiles); |
||||||
236 | |||||||
237 | if (empty($socialCount)) { |
||||||
238 | $dataArray['completeProfile'] = $this->renderView( |
||||||
239 | 'MauticLeadBundle:Social:index.html.php', |
||||||
240 | [ |
||||||
241 | 'socialProfiles' => $socialProfiles, |
||||||
242 | 'lead' => $lead, |
||||||
243 | 'socialProfileUrls' => $helper->getSocialProfileUrlRegex(false), |
||||||
244 | ] |
||||||
245 | ); |
||||||
246 | } |
||||||
247 | |||||||
248 | $dataArray['socialCount'] = $socialCount; |
||||||
249 | } |
||||||
250 | } |
||||||
251 | |||||||
252 | return $this->sendJsonResponse($dataArray); |
||||||
253 | } |
||||||
254 | |||||||
255 | /** |
||||||
256 | * Updates the timeline events and gets returns updated HTML. |
||||||
257 | * |
||||||
258 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
259 | */ |
||||||
260 | protected function updateTimelineAction(Request $request) |
||||||
261 | { |
||||||
262 | $dataArray = ['success' => 0]; |
||||||
263 | $includeEvents = InputHelper::clean($request->request->get('includeEvents', [])); |
||||||
264 | $excludeEvents = InputHelper::clean($request->request->get('excludeEvents', [])); |
||||||
265 | $search = InputHelper::clean($request->request->get('search')); |
||||||
266 | $leadId = (int) $request->request->get('leadId'); |
||||||
267 | |||||||
268 | if (!empty($leadId)) { |
||||||
269 | //find the lead |
||||||
270 | $model = $this->getModel('lead.lead'); |
||||||
271 | $lead = $model->getEntity($leadId); |
||||||
272 | |||||||
273 | if (null !== $lead) { |
||||||
274 | $session = $this->get('session'); |
||||||
275 | |||||||
276 | $filter = [ |
||||||
277 | 'search' => $search, |
||||||
278 | 'includeEvents' => $includeEvents, |
||||||
279 | 'excludeEvents' => $excludeEvents, |
||||||
280 | ]; |
||||||
281 | |||||||
282 | $session->set('mautic.lead.'.$leadId.'.timeline.filters', $filter); |
||||||
283 | |||||||
284 | // Trigger the TIMELINE_ON_GENERATE event to fetch the timeline events from subscribed bundles |
||||||
285 | $dispatcher = $this->dispatcher; |
||||||
286 | $event = new LeadTimelineEvent($lead, $filter); |
||||||
287 | $dispatcher->dispatch(LeadEvents::TIMELINE_ON_GENERATE, $event); |
||||||
288 | |||||||
289 | $events = $event->getEvents(); |
||||||
290 | $eventTypes = $event->getEventTypes(); |
||||||
291 | |||||||
292 | $timeline = $this->renderView( |
||||||
293 | 'MauticLeadBundle:Lead:history.html.php', |
||||||
294 | [ |
||||||
295 | 'events' => $events, |
||||||
296 | 'eventTypes' => $eventTypes, |
||||||
297 | 'eventFilters' => $filter, |
||||||
298 | 'lead' => $lead, |
||||||
299 | ] |
||||||
300 | ); |
||||||
301 | |||||||
302 | $dataArray['success'] = 1; |
||||||
303 | $dataArray['timeline'] = $timeline; |
||||||
304 | $dataArray['historyCount'] = count($events); |
||||||
305 | } |
||||||
306 | } |
||||||
307 | |||||||
308 | return $this->sendJsonResponse($dataArray); |
||||||
309 | } |
||||||
310 | |||||||
311 | /** |
||||||
312 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
313 | */ |
||||||
314 | protected function toggleLeadListAction(Request $request) |
||||||
315 | { |
||||||
316 | $dataArray = ['success' => 0]; |
||||||
317 | $leadId = (int) $request->request->get('leadId'); |
||||||
318 | $listId = (int) $request->request->get('listId'); |
||||||
319 | $action = InputHelper::clean($request->request->get('listAction')); |
||||||
320 | |||||||
321 | if (!empty($leadId) && !empty($listId) && in_array($action, ['remove', 'add'])) { |
||||||
322 | $leadModel = $this->getModel('lead'); |
||||||
323 | $listModel = $this->getModel('lead.list'); |
||||||
324 | |||||||
325 | $lead = $leadModel->getEntity($leadId); |
||||||
326 | $list = $listModel->getEntity($listId); |
||||||
327 | |||||||
328 | if (null !== $lead && null !== $list) { |
||||||
329 | $class = 'add' == $action ? 'addToLists' : 'removeFromLists'; |
||||||
330 | $leadModel->$class($lead, $list); |
||||||
331 | $dataArray['success'] = 1; |
||||||
332 | } |
||||||
333 | } |
||||||
334 | |||||||
335 | return $this->sendJsonResponse($dataArray); |
||||||
336 | } |
||||||
337 | |||||||
338 | /** |
||||||
339 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
340 | */ |
||||||
341 | protected function togglePreferredLeadChannelAction(Request $request) |
||||||
342 | { |
||||||
343 | $dataArray = ['success' => 0]; |
||||||
344 | $leadId = (int) $request->request->get('leadId'); |
||||||
345 | $channel = InputHelper::clean($request->request->get('channel')); |
||||||
346 | $action = InputHelper::clean($request->request->get('channelAction')); |
||||||
347 | |||||||
348 | if (!empty($leadId) && !empty($channel) && in_array($action, ['remove', 'add'])) { |
||||||
349 | $leadModel = $this->getModel('lead'); |
||||||
350 | /** @var DoNotContactModel $doNotContact */ |
||||||
351 | $doNotContact = $this->getModel('lead.dnc'); |
||||||
352 | |||||||
353 | $lead = $leadModel->getEntity($leadId); |
||||||
354 | |||||||
355 | if (null !== $lead && null !== $channel) { |
||||||
356 | if ('remove' === $action) { |
||||||
357 | $doNotContact->addDncForContact($leadId, $channel, DoNotContact::MANUAL, 'user'); |
||||||
358 | } elseif ('add' === $action) { |
||||||
359 | $doNotContact->removeDncForContact($leadId, $channel); |
||||||
360 | } |
||||||
361 | $dataArray['success'] = 1; |
||||||
362 | } |
||||||
363 | } |
||||||
364 | |||||||
365 | return $this->sendJsonResponse($dataArray); |
||||||
366 | } |
||||||
367 | |||||||
368 | /** |
||||||
369 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
370 | */ |
||||||
371 | protected function toggleLeadCampaignAction(Request $request) |
||||||
372 | { |
||||||
373 | $dataArray = ['success' => 0]; |
||||||
374 | $leadId = (int) $request->request->get('leadId'); |
||||||
375 | $campaignId = (int) $request->request->get('campaignId'); |
||||||
376 | $action = InputHelper::clean($request->request->get('campaignAction')); |
||||||
377 | |||||||
378 | if (empty($leadId) || empty($campaignId) || !in_array($action, ['remove', 'add'])) { |
||||||
379 | return $this->sendJsonResponse($dataArray); |
||||||
380 | } |
||||||
381 | |||||||
382 | /** @var LeadModel $leadModel */ |
||||||
383 | $leadModel = $this->getModel('lead'); |
||||||
384 | |||||||
385 | /** @var CampaignModel $campaignModel */ |
||||||
386 | $campaignModel = $this->getModel('campaign'); |
||||||
387 | |||||||
388 | $lead = $leadModel->getEntity($leadId); |
||||||
389 | $campaign = $campaignModel->getEntity($campaignId); |
||||||
390 | |||||||
391 | if (null === $lead || null === $campaign) { |
||||||
392 | return $this->sendJsonResponse($dataArray); |
||||||
393 | } |
||||||
394 | |||||||
395 | /** @var MembershipManager $membershipManager */ |
||||||
396 | $membershipManager = $this->get('mautic.campaign.membership.manager'); |
||||||
397 | |||||||
398 | if ('add' === $action) { |
||||||
399 | $membershipManager->addContact($lead, $campaign); |
||||||
400 | } |
||||||
401 | |||||||
402 | if ('remove' === $action) { |
||||||
403 | $membershipManager->removeContact($lead, $campaign); |
||||||
404 | } |
||||||
405 | |||||||
406 | $dataArray['success'] = 1; |
||||||
407 | |||||||
408 | return $this->sendJsonResponse($dataArray); |
||||||
409 | } |
||||||
410 | |||||||
411 | /** |
||||||
412 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
413 | */ |
||||||
414 | protected function toggleCompanyLeadAction(Request $request) |
||||||
415 | { |
||||||
416 | $dataArray = ['success' => 0]; |
||||||
417 | $leadId = (int) $request->request->get('leadId'); |
||||||
418 | $companyId = (int) $request->request->get('companyId'); |
||||||
419 | $action = InputHelper::clean($request->request->get('companyAction')); |
||||||
420 | |||||||
421 | if (!empty($leadId) && !empty($companyId) && in_array($action, ['remove', 'add'])) { |
||||||
422 | $leadModel = $this->getModel('lead'); |
||||||
423 | $companyModel = $this->getModel('lead.company'); |
||||||
424 | |||||||
425 | $lead = $leadModel->getEntity($leadId); |
||||||
426 | $company = $companyModel->getEntity($companyId); |
||||||
427 | |||||||
428 | if (null !== $lead && null !== $company) { |
||||||
429 | $class = 'add' == $action ? 'addLeadToCompany' : 'removeLeadFromCompany'; |
||||||
430 | $companyModel->$class($company, $lead); |
||||||
431 | $dataArray['success'] = 1; |
||||||
432 | } |
||||||
433 | } |
||||||
434 | |||||||
435 | return $this->sendJsonResponse($dataArray); |
||||||
436 | } |
||||||
437 | |||||||
438 | /** |
||||||
439 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
440 | */ |
||||||
441 | protected function getImportProgressAction(Request $request) |
||||||
442 | { |
||||||
443 | $dataArray = ['success' => 1]; |
||||||
444 | |||||||
445 | if ($this->get('mautic.security')->isGranted('lead:leads:create')) { |
||||||
446 | $session = $this->get('session'); |
||||||
447 | $dataArray['progress'] = $session->get('mautic.lead.import.progress', [0, 0]); |
||||||
448 | $dataArray['percent'] = ($dataArray['progress'][1]) ? ceil(($dataArray['progress'][0] / $dataArray['progress'][1]) * 100) : 100; |
||||||
449 | } |
||||||
450 | |||||||
451 | return $this->sendJsonResponse($dataArray); |
||||||
452 | } |
||||||
453 | |||||||
454 | /** |
||||||
455 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
456 | */ |
||||||
457 | protected function removeBounceStatusAction(Request $request) |
||||||
458 | { |
||||||
459 | $dataArray = ['success' => 0]; |
||||||
460 | $dncId = $request->request->get('id'); |
||||||
461 | |||||||
462 | if (!empty($dncId)) { |
||||||
463 | /** @var \Mautic\LeadBundle\Model\LeadModel $model */ |
||||||
464 | |||||||
465 | /** @var DoNotContactModel $doNotContact */ |
||||||
466 | $doNotContact = $this->getModel('lead.dnc'); |
||||||
467 | |||||||
468 | /** @var DoNotContactModel $dnc */ |
||||||
469 | $dnc = $this->getDoctrine()->getManager()->getRepository('MauticLeadBundle:DoNotContact')->findOneBy( |
||||||
470 | [ |
||||||
471 | 'id' => $dncId, |
||||||
472 | ] |
||||||
473 | ); |
||||||
474 | |||||||
475 | $lead = $dnc->getLead(); |
||||||
476 | if ($lead) { |
||||||
477 | // Use lead model to trigger listeners |
||||||
478 | $doNotContact->removeDncForContact($lead->getId(), 'email'); |
||||||
479 | } else { |
||||||
480 | $this->getModel('email')->getRepository()->deleteDoNotEmailEntry($dncId); |
||||||
481 | } |
||||||
482 | |||||||
483 | $dataArray['success'] = 1; |
||||||
484 | } |
||||||
485 | |||||||
486 | return $this->sendJsonResponse($dataArray); |
||||||
487 | } |
||||||
488 | |||||||
489 | /** |
||||||
490 | * Get the rows for new leads. |
||||||
491 | * |
||||||
492 | * @return array|\Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse |
||||||
493 | */ |
||||||
494 | protected function getNewLeadsAction(Request $request) |
||||||
495 | { |
||||||
496 | $dataArray = ['success' => 0]; |
||||||
497 | $maxId = $request->get('maxId'); |
||||||
498 | |||||||
499 | if (!empty($maxId)) { |
||||||
500 | //set some permissions |
||||||
501 | $permissions = $this->get('mautic.security')->isGranted( |
||||||
502 | [ |
||||||
503 | 'lead:leads:viewown', |
||||||
504 | 'lead:leads:viewother', |
||||||
505 | 'lead:leads:create', |
||||||
506 | 'lead:leads:editown', |
||||||
507 | 'lead:leads:editother', |
||||||
508 | 'lead:leads:deleteown', |
||||||
509 | 'lead:leads:deleteother', |
||||||
510 | ], |
||||||
511 | 'RETURN_ARRAY' |
||||||
512 | ); |
||||||
513 | |||||||
514 | if (!$permissions['lead:leads:viewown'] && !$permissions['lead:leads:viewother']) { |
||||||
515 | return $this->accessDenied(true); |
||||||
516 | } |
||||||
517 | |||||||
518 | /** @var \Mautic\LeadBundle\Model\LeadModel $model */ |
||||||
519 | $model = $this->getModel('lead.lead'); |
||||||
520 | $session = $this->get('session'); |
||||||
521 | |||||||
522 | $search = $session->get('mautic.lead.filter', ''); |
||||||
523 | |||||||
524 | $filter = ['string' => $search, 'force' => []]; |
||||||
525 | $translator = $this->translator; |
||||||
526 | $anonymous = $translator->trans('mautic.lead.lead.searchcommand.isanonymous'); |
||||||
527 | $mine = $translator->trans('mautic.core.searchcommand.ismine'); |
||||||
528 | $indexMode = $session->get('mautic.lead.indexmode', 'list'); |
||||||
529 | |||||||
530 | $session->set('mautic.lead.indexmode', $indexMode); |
||||||
531 | |||||||
532 | // (strpos($search, "$isCommand:$anonymous") === false && strpos($search, "$listCommand:") === false)) || |
||||||
533 | if ('list' != $indexMode) { |
||||||
534 | //remove anonymous leads unless requested to prevent clutter |
||||||
535 | $filter['force'][] = "!$anonymous"; |
||||||
536 | } |
||||||
537 | |||||||
538 | if (!$permissions['lead:leads:viewother']) { |
||||||
539 | $filter['force'][] = $mine; |
||||||
540 | } |
||||||
541 | |||||||
542 | $filter['force'][] = [ |
||||||
543 | 'column' => 'l.id', |
||||||
544 | 'expr' => 'gt', |
||||||
545 | 'value' => $maxId, |
||||||
546 | ]; |
||||||
547 | |||||||
548 | $results = $model->getEntities( |
||||||
549 | [ |
||||||
550 | 'filter' => $filter, |
||||||
551 | 'withTotalCount' => true, |
||||||
552 | ] |
||||||
553 | ); |
||||||
554 | $count = $results['count']; |
||||||
555 | |||||||
556 | if (!empty($count)) { |
||||||
557 | // Get the max ID of the latest lead added |
||||||
558 | $maxLeadId = $model->getRepository()->getMaxLeadId(); |
||||||
559 | |||||||
560 | // We need the EmailRepository to check if a lead is flagged as do not contact |
||||||
561 | /** @var \Mautic\EmailBundle\Entity\EmailRepository $emailRepo */ |
||||||
562 | $emailRepo = $this->getModel('email')->getRepository(); |
||||||
563 | $indexMode = $this->request->get('view', $session->get('mautic.lead.indexmode', 'list')); |
||||||
564 | $template = ('list' == $indexMode) ? 'list_rows' : 'grid_cards'; |
||||||
565 | $dataArray['leads'] = $this->factory->getTemplating()->render( |
||||||
566 | "MauticLeadBundle:Lead:{$template}.html.php", |
||||||
567 | [ |
||||||
568 | 'items' => $results['results'], |
||||||
569 | 'noContactList' => $emailRepo->getDoNotEmailList(array_keys($results['results'])), |
||||||
570 | 'permissions' => $permissions, |
||||||
571 | 'security' => $this->get('mautic.security'), |
||||||
572 | 'highlight' => true, |
||||||
573 | ] |
||||||
574 | ); |
||||||
575 | $dataArray['indexMode'] = $indexMode; |
||||||
576 | $dataArray['maxId'] = $maxLeadId; |
||||||
577 | $dataArray['success'] = 1; |
||||||
578 | } |
||||||
579 | } |
||||||
580 | |||||||
581 | return $this->sendJsonResponse($dataArray); |
||||||
582 | } |
||||||
583 | |||||||
584 | /** |
||||||
585 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
586 | */ |
||||||
587 | protected function getEmailTemplateAction(Request $request) |
||||||
588 | { |
||||||
589 | $data = ['success' => 1, 'body' => '', 'subject' => '']; |
||||||
590 | $emailId = $request->get('template'); |
||||||
591 | |||||||
592 | /** @var \Mautic\EmailBundle\Model\EmailModel $model */ |
||||||
593 | $model = $this->getModel('email'); |
||||||
594 | |||||||
595 | /** @var \Mautic\EmailBundle\Entity\Email $email */ |
||||||
596 | $email = $model->getEntity($emailId); |
||||||
597 | |||||||
598 | if (null !== $email |
||||||
599 | && $this->get('mautic.security')->hasEntityAccess( |
||||||
600 | 'email:emails:viewown', |
||||||
601 | 'email:emails:viewother', |
||||||
602 | $email->getCreatedBy() |
||||||
603 | ) |
||||||
604 | ) { |
||||||
605 | $mailer = $this->factory->getMailer(); |
||||||
606 | $mailer->setEmail($email, true, [], [], true); |
||||||
607 | |||||||
608 | $data['body'] = $mailer->getBody(); |
||||||
609 | $data['subject'] = $mailer->getSubject(); |
||||||
610 | } |
||||||
611 | |||||||
612 | return $this->sendJsonResponse($data); |
||||||
613 | } |
||||||
614 | |||||||
615 | /** |
||||||
616 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
617 | */ |
||||||
618 | protected function updateLeadTagsAction(Request $request) |
||||||
619 | { |
||||||
620 | /** @var \Mautic\LeadBundle\Model\LeadModel $leadModel */ |
||||||
621 | $leadModel = $this->getModel('lead'); |
||||||
622 | $post = $request->request->get('lead_tags', [], true); |
||||||
623 | $lead = $leadModel->getEntity((int) $post['id']); |
||||||
624 | $updatedTags = (!empty($post['tags']) && is_array($post['tags'])) ? $post['tags'] : []; |
||||||
625 | $data = ['success' => 0]; |
||||||
626 | |||||||
627 | if (null !== $lead && $this->get('mautic.security')->hasEntityAccess('lead:leads:editown', 'lead:leads:editother', $lead->getPermissionUser())) { |
||||||
628 | $leadModel->setTags($lead, $updatedTags, true); |
||||||
629 | |||||||
630 | /** @var \Doctrine\ORM\PersistentCollection $leadTags */ |
||||||
631 | $leadTags = $lead->getTags(); |
||||||
632 | $leadTagKeys = $leadTags->getKeys(); |
||||||
633 | |||||||
634 | // Get an updated list of tags |
||||||
635 | $tags = $leadModel->getTagRepository()->getSimpleList(null, [], 'tag'); |
||||||
636 | $tagOptions = ''; |
||||||
637 | |||||||
638 | foreach ($tags as $tag) { |
||||||
639 | $selected = (in_array($tag['label'], $leadTagKeys)) ? ' selected="selected"' : ''; |
||||||
640 | $tagOptions .= '<option'.$selected.' value="'.$tag['value'].'">'.$tag['label'].'</option>'; |
||||||
641 | } |
||||||
642 | |||||||
643 | $data['success'] = 1; |
||||||
644 | $data['tags'] = $tagOptions; |
||||||
645 | } |
||||||
646 | |||||||
647 | return $this->sendJsonResponse($data); |
||||||
648 | } |
||||||
649 | |||||||
650 | /** |
||||||
651 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
652 | */ |
||||||
653 | protected function addLeadTagsAction(Request $request) |
||||||
654 | { |
||||||
655 | $tags = $request->request->get('tags'); |
||||||
656 | $tags = json_decode($tags, true); |
||||||
657 | |||||||
658 | if (is_array($tags)) { |
||||||
659 | $leadModel = $this->getModel('lead'); |
||||||
660 | $newTags = []; |
||||||
661 | |||||||
662 | foreach ($tags as $tag) { |
||||||
663 | if (!is_numeric($tag)) { |
||||||
664 | $newTags[] = $leadModel->getTagRepository()->getTagByNameOrCreateNewOne($tag); |
||||||
665 | } |
||||||
666 | } |
||||||
667 | |||||||
668 | if (!empty($newTags)) { |
||||||
669 | $leadModel->getTagRepository()->saveEntities($newTags); |
||||||
670 | } |
||||||
671 | |||||||
672 | // Get an updated list of tags |
||||||
673 | $allTags = $leadModel->getTagRepository()->getSimpleList(null, [], 'tag'); |
||||||
674 | $tagOptions = ''; |
||||||
675 | |||||||
676 | foreach ($allTags as $tag) { |
||||||
677 | $selected = (in_array($tag['value'], $tags) || in_array($tag['label'], $tags)) ? ' selected="selected"' : ''; |
||||||
678 | $tagOptions .= '<option'.$selected.' value="'.$tag['value'].'">'.$tag['label'].'</option>'; |
||||||
679 | } |
||||||
680 | |||||||
681 | $data = [ |
||||||
682 | 'success' => 1, |
||||||
683 | 'tags' => $tagOptions, |
||||||
684 | ]; |
||||||
685 | } else { |
||||||
686 | $data = ['success' => 0]; |
||||||
687 | } |
||||||
688 | |||||||
689 | return $this->sendJsonResponse($data); |
||||||
690 | } |
||||||
691 | |||||||
692 | /** |
||||||
693 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
694 | */ |
||||||
695 | protected function addLeadUtmTagsAction(Request $request) |
||||||
696 | { |
||||||
697 | $utmTags = $request->request->get('utmtags'); |
||||||
698 | $utmTags = json_decode($utmTags, true); |
||||||
699 | |||||||
700 | if (is_array($utmTags)) { |
||||||
701 | $newUtmTags = []; |
||||||
702 | foreach ($utmTags as $utmTag) { |
||||||
703 | if (!is_numeric($utmTag)) { |
||||||
704 | // New tag |
||||||
705 | $utmTagEntity = new UtmTag(); |
||||||
706 | $utmTagEntity->setUtmTag(InputHelper::clean($utmTag)); |
||||||
0 ignored issues
–
show
|
|||||||
707 | $newUtmTags[] = $utmTagEntity; |
||||||
708 | } |
||||||
709 | } |
||||||
710 | |||||||
711 | $leadModel = $this->getModel('lead'); |
||||||
712 | |||||||
713 | if (!empty($newUtmTags)) { |
||||||
714 | $leadModel->getUtmTagRepository()->saveEntities($newUtmTags); |
||||||
0 ignored issues
–
show
The method
getUtmTagRepository() does not exist on Mautic\CoreBundle\Model\AbstractCommonModel . It seems like you code against a sub-type of Mautic\CoreBundle\Model\AbstractCommonModel such as Mautic\LeadBundle\Model\LeadModel .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
715 | } |
||||||
716 | |||||||
717 | // Get an updated list of tags |
||||||
718 | $allUtmTags = $leadModel->getUtmTagRepository()->getSimpleList(null, [], 'utmtag'); |
||||||
719 | $utmTagOptions = ''; |
||||||
720 | |||||||
721 | foreach ($allUtmTags as $utmTag) { |
||||||
722 | $selected = (in_array($utmTag['value'], $utmTags) || in_array($utmTag['label'], $utmTags)) ? ' selected="selected"' : ''; |
||||||
723 | $utmTagOptions .= '<option'.$selected.' value="'.$utmTag['value'].'">'.$utmTag['label'].'</option>'; |
||||||
724 | } |
||||||
725 | |||||||
726 | $data = [ |
||||||
727 | 'success' => 1, |
||||||
728 | 'tags' => $utmTagOptions, |
||||||
729 | ]; |
||||||
730 | } else { |
||||||
731 | $data = ['success' => 0]; |
||||||
732 | } |
||||||
733 | |||||||
734 | return $this->sendJsonResponse($data); |
||||||
735 | } |
||||||
736 | |||||||
737 | /** |
||||||
738 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
739 | */ |
||||||
740 | protected function reorderAction(Request $request) |
||||||
741 | { |
||||||
742 | $dataArray = ['success' => 0]; |
||||||
743 | $order = InputHelper::clean($request->request->get('field')); |
||||||
744 | $page = (int) $request->get('page'); |
||||||
745 | $limit = (int) $request->get('limit'); |
||||||
746 | |||||||
747 | if (!empty($order)) { |
||||||
748 | /** @var \Mautic\LeadBundle\Model\FieldModel $model */ |
||||||
749 | $model = $this->getModel('lead.field'); |
||||||
750 | |||||||
751 | $startAt = ($page > 1) ? ($page * $limit) + 1 : 1; |
||||||
752 | $model->reorderFieldsByList($order, $startAt); |
||||||
753 | $dataArray['success'] = 1; |
||||||
754 | } |
||||||
755 | |||||||
756 | return $this->sendJsonResponse($dataArray); |
||||||
757 | } |
||||||
758 | |||||||
759 | /** |
||||||
760 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
761 | */ |
||||||
762 | protected function updateLeadFieldValuesAction(Request $request) |
||||||
763 | { |
||||||
764 | $alias = InputHelper::clean($request->request->get('alias')); |
||||||
765 | $operator = InputHelper::clean($request->request->get('operator')); |
||||||
766 | $changed = InputHelper::clean($request->request->get('changed')); |
||||||
767 | $dataArray = ['success' => 0, 'options' => null, 'optionsAttr' => [], 'operators' => null, 'disabled' => false]; |
||||||
768 | $leadField = $this->getModel('lead.field')->getRepository()->findOneBy(['alias' => $alias]); |
||||||
769 | |||||||
770 | if ($leadField) { |
||||||
771 | $options = null; |
||||||
772 | $leadFieldType = $leadField->getType(); |
||||||
773 | |||||||
774 | $properties = $leadField->getProperties(); |
||||||
775 | if (!empty($properties['list'])) { |
||||||
776 | // Lookup/Select options |
||||||
777 | $options = FormFieldHelper::parseList($properties['list']); |
||||||
778 | } elseif (!empty($properties) && 'boolean' == $leadFieldType) { |
||||||
779 | // Boolean options |
||||||
780 | $options = [ |
||||||
781 | 0 => $properties['no'], |
||||||
782 | 1 => $properties['yes'], |
||||||
783 | ]; |
||||||
784 | } else { |
||||||
785 | switch ($leadFieldType) { |
||||||
786 | case 'country': |
||||||
787 | $options = FormFieldHelper::getCountryChoices(); |
||||||
788 | break; |
||||||
789 | case 'region': |
||||||
790 | $options = FormFieldHelper::getRegionChoices(); |
||||||
791 | break; |
||||||
792 | case 'timezone': |
||||||
793 | $options = FormFieldHelper::getTimezonesChoices(); |
||||||
794 | break; |
||||||
795 | case 'locale': |
||||||
796 | $options = FormFieldHelper::getLocaleChoices(); |
||||||
797 | break; |
||||||
798 | case 'date': |
||||||
799 | case 'datetime': |
||||||
800 | if ('date' == $operator) { |
||||||
801 | $fieldHelper = new FormFieldHelper(); |
||||||
802 | $fieldHelper->setTranslator($this->get('translator')); |
||||||
803 | $options = $fieldHelper->getDateChoices(); |
||||||
804 | $options = array_merge( |
||||||
805 | [ |
||||||
806 | 'custom' => $this->translator->trans('mautic.campaign.event.timed.choice.custom'), |
||||||
807 | ], |
||||||
808 | $options |
||||||
809 | ); |
||||||
810 | |||||||
811 | $dataArray['optionsAttr']['custom'] = [ |
||||||
812 | 'data-custom' => 1, |
||||||
813 | ]; |
||||||
814 | } |
||||||
815 | break; |
||||||
816 | default: |
||||||
817 | $options = (!empty($properties)) ? $properties : []; |
||||||
818 | } |
||||||
819 | } |
||||||
820 | |||||||
821 | $dataArray['fieldType'] = $leadFieldType; |
||||||
822 | $dataArray['options'] = $options; |
||||||
823 | |||||||
824 | if ('field' === $changed) { |
||||||
825 | $dataArray['operators'] = $this->getModel('lead')->getOperatorsForFieldType($leadFieldType, ['date']); |
||||||
826 | foreach ($dataArray['operators'] as $value => $label) { |
||||||
827 | $dataArray['operators'][$value] = $this->get('translator')->trans($label); |
||||||
828 | } |
||||||
829 | |||||||
830 | reset($dataArray['operators']); |
||||||
831 | $operator = key($dataArray['operators']); |
||||||
832 | } |
||||||
833 | |||||||
834 | $disabled = false; |
||||||
835 | switch ($operator) { |
||||||
836 | case 'empty': |
||||||
837 | case '!empty': |
||||||
838 | $disabled = true; |
||||||
839 | $dataArray['options'] = null; |
||||||
840 | break; |
||||||
841 | case 'regexp': |
||||||
842 | case '!regexp': |
||||||
843 | $dataArray['options'] = null; |
||||||
844 | break; |
||||||
845 | } |
||||||
846 | $dataArray['disabled'] = $disabled; |
||||||
847 | } |
||||||
848 | |||||||
849 | $dataArray['success'] = 1; |
||||||
850 | |||||||
851 | return $this->sendJsonResponse($dataArray); |
||||||
852 | } |
||||||
853 | |||||||
854 | /** |
||||||
855 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||||||
856 | */ |
||||||
857 | protected function setAsPrimaryCompanyAction(Request $request) |
||||||
858 | { |
||||||
859 | $dataArray['success'] = 1; |
||||||
860 | $companyId = InputHelper::clean($request->request->get('companyId')); |
||||||
861 | $leadId = InputHelper::clean($request->request->get('leadId')); |
||||||
862 | |||||||
863 | $leadModel = $this->getModel('lead'); |
||||||
864 | $primaryCompany = $leadModel->setPrimaryCompany($companyId, $leadId); |
||||||
0 ignored issues
–
show
The method
setPrimaryCompany() does not exist on Mautic\CoreBundle\Model\AbstractCommonModel . It seems like you code against a sub-type of Mautic\CoreBundle\Model\AbstractCommonModel such as Mautic\LeadBundle\Model\LeadModel .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
865 | |||||||
866 | $dataArray = array_merge($dataArray, $primaryCompany); |
||||||
867 | |||||||
868 | return $this->sendJsonResponse($dataArray); |
||||||
869 | } |
||||||
870 | |||||||
871 | protected function getCampaignShareStatsAction(Request $request) |
||||||
872 | { |
||||||
873 | $ids = $request->get('ids'); |
||||||
874 | $entityid = $request->get('entityId'); |
||||||
875 | /** @var SegmentCampaignShare $segmentCampaignShareService */ |
||||||
876 | $segmentCampaignShareService = $this->get('mautic.lead.segment.stat.campaign.share'); |
||||||
877 | |||||||
878 | $data = $segmentCampaignShareService->getCampaignsSegmentShare($entityid, $ids); |
||||||
879 | |||||||
880 | $data = [ |
||||||
881 | 'success' => 1, |
||||||
882 | 'stats' => $data, |
||||||
883 | ]; |
||||||
884 | |||||||
885 | return new JsonResponse($data); |
||||||
886 | } |
||||||
887 | } |
||||||
888 |
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.
This is most likely a typographical error or the method has been renamed.