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)); |
||
707 | $newUtmTags[] = $utmTagEntity; |
||
708 | } |
||
709 | } |
||
710 | |||
711 | $leadModel = $this->getModel('lead'); |
||
712 | |||
713 | if (!empty($newUtmTags)) { |
||
714 | $leadModel->getUtmTagRepository()->saveEntities($newUtmTags); |
||
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; |
||
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
Loading history...
|
|||
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); |
||
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 |