Issues (3627)

bundles/LeadBundle/Controller/AjaxController.php (4 issues)

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
The method setUtmTag() does not exist on Mautic\LeadBundle\Entity\UtmTag. Did you maybe mean setUtmTerm()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

706
                    $utmTagEntity->/** @scrutinizer ignore-call */ 
707
                                   setUtmTag(InputHelper::clean($utmTag));

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.

Loading history...
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 ignore-call  annotation

714
                $leadModel->/** @scrutinizer ignore-call */ 
715
                            getUtmTagRepository()->saveEntities($newUtmTags);
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;
0 ignored issues
show
Comprehensibility Best Practice introduced by
$dataArray was never initialized. Although not strictly required by PHP, it is generally a good practice to add $dataArray = array(); before regardless.
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);
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 ignore-call  annotation

864
        /** @scrutinizer ignore-call */ 
865
        $primaryCompany = $leadModel->setPrimaryCompany($companyId, $leadId);
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