Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 5020 | Rev 5027 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
4384 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
4579 eleazar 11
use Laminas\View\Model\ViewModel;
4384 eleazar 12
use Laminas\View\Model\JsonModel;
4579 eleazar 13
use LeadersLinked\Mapper\SurveyMapper;
4678 eleazar 14
use LeadersLinked\Mapper\SurveyFormMapper;
4883 eleazar 15
use LeadersLinked\Mapper\SurveyJobDescriptionMapper;
16
use LeadersLinked\Mapper\SurveyIndustryMapper;
17
use LeadersLinked\Mapper\SurveyJobCategoryMapper;
18
use LeadersLinked\Mapper\SurveyLocationMapper;
19
use LeadersLinked\Mapper\SurveyServiceMapper;
4855 eleazar 20
use LeadersLinked\Model\Location;
21
use LeadersLinked\Mapper\LocationMapper;
22
use LeadersLinked\Mapper\IndustryMapper;
23
use LeadersLinked\Mapper\JobDescriptionMapper;
24
use LeadersLinked\Mapper\BehaviorMapper;
25
use LeadersLinked\Mapper\JobDescriptionBehaviorCompetencyMapper;
26
use LeadersLinked\Mapper\CompanyMapper;
27
use LeadersLinked\Mapper\ServiceMapper;
28
use LeadersLinked\Model\Company;
29
use LeadersLinked\Mapper\JobCategoryMapper;
4865 eleazar 30
use LeadersLinked\Form\SurveySegmentedForm;
4579 eleazar 31
use LeadersLinked\Form\SurveyForm;
32
use LeadersLinked\Model\Survey;
33
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
5026 efrain 34
use LeadersLinked\Model\SurveyJobDescription;
4384 eleazar 35
 
36
class SurveyController extends AbstractActionController {
37
 
38
    /**
39
     *
40
     * @var AdapterInterface
41
     */
42
    private $adapter;
43
 
44
    /**
45
     *
46
     * @var AbstractAdapter
47
     */
48
    private $cache;
49
 
50
    /**
51
     *
52
     * @var  LoggerInterface
53
     */
54
    private $logger;
55
 
56
    /**
57
     *
58
     * @var array
59
     */
60
    private $config;
61
 
62
    /**
63
     *
64
     * @param AdapterInterface $adapter
65
     * @param AbstractAdapter $cache
66
     * @param LoggerInterface $logger
67
     * @param array $config
68
     */
69
    public function __construct($adapter, $cache, $logger, $config) {
70
        $this->adapter = $adapter;
71
        $this->cache = $cache;
72
        $this->logger = $logger;
73
        $this->config = $config;
74
    }
75
 
76
    public function indexAction() {
4579 eleazar 77
        $request = $this->getRequest();
78
        $currentUserPlugin = $this->plugin('currentUserPlugin');
79
        $currentCompany = $currentUserPlugin->getCompany();
80
        $currentUser = $currentUserPlugin->getUser();
4384 eleazar 81
 
4579 eleazar 82
 
83
        $request = $this->getRequest();
84
        if ($request->isGet()) {
85
 
86
            $headers = $request->getHeaders();
87
 
88
            $isJson = false;
89
            if ($headers->has('Accept')) {
90
                $accept = $headers->get('Accept');
91
 
92
                $prioritized = $accept->getPrioritized();
93
 
94
                foreach ($prioritized as $key => $value) {
95
                    $raw = trim($value->getRaw());
96
 
97
                    if (!$isJson) {
98
                        $isJson = strpos($raw, 'json');
99
                    }
100
                }
101
            }
102
 
103
            if ($isJson) {
104
                $search = $this->params()->fromQuery('search', []);
105
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
106
 
107
                $page = intval($this->params()->fromQuery('start', 1), 10);
108
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
109
                $order = $this->params()->fromQuery('order', []);
110
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
111
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
112
 
113
                $fields = ['name'];
114
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
115
 
116
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
117
                    $order_direction = 'ASC';
118
                }
119
 
4661 eleazar 120
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
121
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'survey/add');
122
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'survey/edit');
123
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'survey/delete');
124
                $allowSegment = $acl->isAllowed($currentUser->usertype_id, 'survey/segment');
125
 
4579 eleazar 126
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
127
                $paginator = $surveyMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
128
 
129
                $items = [];
130
                $records = $paginator->getCurrentItems();
131
 
132
                foreach ($records as $record) {
4754 eleazar 133
                    $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
134
                    $surveyForm = $surveyFormMapper->fetchOne($record->form_id);
135
 
4579 eleazar 136
                    $item = [
137
                        'id' => $record->id,
138
                        'name' => $record->name,
4754 eleazar 139
                        'form' => $surveyForm->name,
4579 eleazar 140
                        'status' => $record->status,
141
                        'actions' => [
142
                            'link_edit' => $this->url()->fromRoute('survey/edit', ['id' => $record->uuid]),
143
                            'link_delete' => $this->url()->fromRoute('survey/delete', ['id' => $record->uuid]),
144
                            'link_segment' => $this->url()->fromRoute('survey/segment', ['id' => $record->uuid])
145
                        ]
146
                    ];
147
 
148
                    array_push($items, $item);
149
                }
150
 
151
                return new JsonModel([
152
                    'success' => true,
153
                    'data' => [
154
                        'items' => $items,
155
                        'total' => $paginator->getTotalItemCount(),
156
                    ]
157
                ]);
158
            } else {
159
 
160
                $form = new SurveyForm($this->adapter, $currentCompany->id);
4873 eleazar 161
                $formSegmented = new SurveySegmentedForm($this->adapter, $currentCompany->id);
4579 eleazar 162
 
163
                $this->layout()->setTemplate('layout/layout-backend');
164
                $viewModel = new ViewModel();
165
                $viewModel->setTemplate('leaders-linked/survey/index.phtml');
166
                $viewModel->setVariable('form', $form);
4873 eleazar 167
                $viewModel->setVariable('formSegmented', $formSegmented);
4579 eleazar 168
                return $viewModel;
169
            }
170
        } else {
171
            return new JsonModel([
172
                'success' => false,
173
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
174
            ]);
175
        }
4384 eleazar 176
    }
177
 
4579 eleazar 178
    public function addAction() {
179
        $request = $this->getRequest();
180
        $currentUserPlugin = $this->plugin('currentUserPlugin');
181
        $currentCompany = $currentUserPlugin->getCompany();
182
        $currentUser = $currentUserPlugin->getUser();
183
 
184
        $request = $this->getRequest();
185
 
186
        if ($request->isPost()) {
187
 
188
            $form = new SurveyForm($this->adapter, $currentCompany->id);
4672 eleazar 189
 
4579 eleazar 190
            $dataPost = $request->getPost()->toArray();
4661 eleazar 191
            $dataPost['status'] = isset($dataPost['status']) ? $dataPost['status'] : SurveyForm::STATUS_INACTIVE;
4579 eleazar 192
 
193
            $form->setData($dataPost);
194
 
195
            if ($form->isValid()) {
196
                $dataPost = (array) $form->getData();
197
 
198
                $hydrator = new ObjectPropertyHydrator();
199
                $survey = new Survey();
200
                $hydrator->hydrate($dataPost, $survey);
201
 
202
                if (!$survey->status) {
203
                    $survey->status = Survey::STATUS_INACTIVE;
204
                }
205
                $survey->company_id = $currentCompany->id;
206
 
4677 eleazar 207
                $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
208
                $surveyForm = $surveyFormMapper->fetchOneByUuid($dataPost['form_id']);
209
                $survey->form_id = $surveyForm->id;
4579 eleazar 210
 
4724 eleazar 211
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
212
                $result = $surveyMapper->insert($survey);
4730 eleazar 213
 
4579 eleazar 214
                if ($result) {
4734 eleazar 215
 
4728 eleazar 216
                    if ($result) {
4579 eleazar 217
 
218
                        $data = [
219
                            'success' => true,
220
                            'data' => 'LABEL_RECORD_ADDED'
221
                        ];
222
                    } else {
223
 
224
                        $data = [
225
                            'success' => false,
226
                            'data' => 'ERROR_RECORD_NOT_FOUND'
227
                        ];
228
                    }
229
                } else {
230
                    $data = [
231
                        'success' => false,
232
                        'data' => $surveyMapper->getError()
233
                    ];
234
                }
235
 
236
                return new JsonModel($data);
237
            } else {
238
                $messages = [];
239
                $form_messages = (array) $form->getMessages();
240
                foreach ($form_messages as $fieldname => $field_messages) {
241
 
242
                    $messages[$fieldname] = array_values($field_messages);
243
                }
244
 
245
                return new JsonModel([
246
                    'success' => false,
247
                    'data' => $messages
248
                ]);
249
            }
250
        } else {
251
            $data = [
252
                'success' => false,
253
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
254
            ];
255
 
256
            return new JsonModel($data);
257
        }
258
 
259
        return new JsonModel($data);
260
    }
261
 
4856 eleazar 262
    public function segmentAction() {
4855 eleazar 263
        $request = $this->getRequest();
264
        $currentUserPlugin = $this->plugin('currentUserPlugin');
265
        $currentCompany = $currentUserPlugin->getCompany();
266
        $currentUser = $currentUserPlugin->getUser();
267
 
268
        $request = $this->getRequest();
269
        $uuid = $this->params()->fromRoute('id');
270
 
271
 
272
        if (!$uuid) {
273
            $data = [
274
                'success' => false,
275
                'data' => 'ERROR_INVALID_PARAMETER'
276
            ];
277
 
278
            return new JsonModel($data);
279
        }
280
 
281
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
282
        $survey = $surveyMapper->fetchOneByUuid($uuid);
283
        if (!$survey) {
284
            $data = [
285
                'success' => false,
286
                'data' => 'ERROR_RECORD_NOT_FOUND'
287
            ];
288
 
289
            return new JsonModel($data);
290
        }
291
 
292
        if ($survey->company_id != $currentCompany->id) {
293
            return new JsonModel([
294
                'success' => false,
295
                'data' => 'ERROR_UNAUTHORIZED'
296
            ]);
297
        }
298
 
4863 eleazar 299
        if($request->isPost()){
4865 eleazar 300
            $form = new SurveySegmentedForm($this->adapter, $currentCompany->id);
4855 eleazar 301
            $dataPost = $request->getPost()->toArray();
5006 eleazar 302
            $form->setData($dataPost);
5019 efrain 303
 
4855 eleazar 304
 
5020 efrain 305
 
4855 eleazar 306
            if ($form->isValid()) {
307
                $dataPost = (array) $form->getData();
308
 
309
                $hydrator = new ObjectPropertyHydrator();
310
 
311
                $location = new Location();
312
                $hydrator->hydrate($dataPost, $location);
313
 
314
                $locationMapper= LocationMapper::getInstance($this->adapter);
315
                $resultLocation = $locationMapper->insert($location);
316
 
317
                if (!$resultLocation) {
318
                    return new JsonModel([
319
                        'success'   => false,
320
                        'data' => 'ERROR_THERE_WAS_AN_ERROR'
321
                    ]);
322
                }
4991 eleazar 323
 
4855 eleazar 324
                $jobDescription = new SurveyJobDescription();
325
                $jobCategory = new SurveyJobCategory();
326
                $industry = new SurveyIndustry();
327
                $service = new SurveyService();
4963 eleazar 328
 
5026 efrain 329
                if($dataPost['job_description_id']){
330
                    $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
331
                    $surveyJobDescriptionMapper = SurveyJobDescriptionMapper::getInstance($this->adapter);
332
 
333
                    $ok = true;
334
 
335
                    foreach($dataPost['job_description_id'] as $jobDescriptionUuid) {
336
 
337
 
338
 
339
 
340
                        $jobDescription = $jobDescriptionMapper->fetchOneByUuid($jobDescriptionUuid);
341
                        if($jobDescription && $jobDescription->company_id != $currentCompany->id) {
342
                            $record = new SurveyJobDescription();
343
                            $record->job_description_id = $jobDescription->id;
344
                            $record->survey_id = $survey->id;
345
 
346
                            $result = $surveyJobDescriptionMapper->insert($record);
347
                            $ok = $ok && $result;
4985 eleazar 348
                        }
4916 eleazar 349
                    }
5026 efrain 350
 
351
                    if($ok){
352
                        $data = [
353
                            'success' => true,
354
                            'data' => 'LABEL_RECORD_ADDED'
355
                        ]
356
                    }
4883 eleazar 357
                }
4855 eleazar 358
 
4916 eleazar 359
                if($dataPost['job_category_id']){
5003 eleazar 360
                    foreach($dataPost['job_category_id'] as $jobCategoryId) {
4985 eleazar 361
                        $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
362
                        $JobCategorySurveyId = $jobCategoryMapper->fetchOneByUuid($jobCategoryId);
363
                        $hydrator->hydrate($dataPost, $JobCategorySurveyId);
364
                        $survey_id = $survey->id;
365
                        $surveyJobCategoryMapper = SurveyJobCategoryMapper::getInstance($this->adapter);
366
                        $record = [
367
                            'survey_id' => $survey_id,
368
                            'job_category_id' => $JobCategorySurveyId,
369
                        ];
370
                        $record = $surveyJobCategoryMapper->insert($JobCategorySurveyId, $survey_id);
4855 eleazar 371
 
4985 eleazar 372
                        if($record){
373
                            $data = [
374
                                'success' => true,
375
                                'data' => 'LABEL_RECORD_ADDED'
376
                            ];
377
                        }
4916 eleazar 378
                    }
379
                }
4855 eleazar 380
 
4916 eleazar 381
                if($dataPost['industry_id']){
4985 eleazar 382
                    foreach($dataPost['industry_id'] as $industry_id) {
383
                        $industryMapper = IndustryMapper::getInstance($this->adapter);
384
                        $industrySurveyId = $industryMapper->fetchOneByUuid($industry_id);
385
                        $hydrator->hydrate($dataPost, $industrySurveyId);
386
                        $survey_id = $survey->id;
387
                        $surveyIndustryMapper = SurveyIndustryMapper::getInstance($this->adapter);
388
                        $record = [
389
                            'survey_id' => $survey_id,
390
                            'industry_id' => $industrySurveyId,
391
                        ];
392
                        $record = $surveyIndustryMapper->insert($record);
4855 eleazar 393
 
4985 eleazar 394
                        if($record){
395
                            $data = [
396
                                'success' => true,
397
                                'data' => 'LABEL_RECORD_ADDED'
398
                            ];
399
                        }
4916 eleazar 400
                    }
4963 eleazar 401
                }
4916 eleazar 402
 
403
                if($dataPost['service_id']){
4985 eleazar 404
                    foreach($dataPost['service_id'] as $service_id) {
405
                        $hydrator->hydrate($dataPost, $service_id);
406
                        $survey_id = $survey->id;
407
                        $surveyServiceMapper = SurveyServiceMapper::getInstance($this->adapter);
408
                        $record = [
409
                            'survey_id' => $survey_id,
410
                            'service_id' => $service_id,
411
                        ];
412
                        $record = $surveyServiceMapper->insert($record);
4855 eleazar 413
 
4985 eleazar 414
                        if($record){
415
                            $data = [
416
                                'success' => true,
417
                                'data' => 'LABEL_RECORD_ADDED'
418
                            ];
419
                        }
4916 eleazar 420
                    }
4855 eleazar 421
                }
422
 
423
                return new JsonModel($data);
424
            } else {
5013 eleazar 425
                $messages = [];
4855 eleazar 426
                $form_messages = (array) $form->getMessages();
427
                foreach ($form_messages as $fieldname => $field_messages) {
428
 
429
                    $messages[$fieldname] = array_values($field_messages);
430
                }
431
 
432
                return new JsonModel([
433
                    'success' => false,
5011 eleazar 434
                    'data' => $messages
5013 eleazar 435
                ]);
4855 eleazar 436
            }
437
        } else {
438
            $data = [
439
                'success' => false,
440
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
441
            ];
442
 
443
            return new JsonModel($data);
444
        }
445
 
446
        return new JsonModel($data);
447
 
448
    }
449
 
4579 eleazar 450
    public function editAction() {
451
        $request = $this->getRequest();
452
        $currentUserPlugin = $this->plugin('currentUserPlugin');
453
        $currentCompany = $currentUserPlugin->getCompany();
454
        $currentUser = $currentUserPlugin->getUser();
455
 
456
        $request = $this->getRequest();
457
        $uuid = $this->params()->fromRoute('id');
458
 
459
 
460
        if (!$uuid) {
461
            $data = [
462
                'success' => false,
463
                'data' => 'ERROR_INVALID_PARAMETER'
464
            ];
465
 
466
            return new JsonModel($data);
467
        }
468
 
469
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
470
        $survey = $surveyMapper->fetchOneByUuid($uuid);
471
 
472
        if (!$survey) {
473
            $data = [
474
                'success' => false,
475
                'data' => 'ERROR_RECORD_NOT_FOUND'
476
            ];
477
 
478
            return new JsonModel($data);
479
        }
480
 
481
        if ($survey->company_id != $currentCompany->id) {
482
            return new JsonModel([
483
                'success' => false,
484
                'data' => 'ERROR_UNAUTHORIZED'
485
            ]);
486
        }
487
 
488
 
489
        if ($request->isPost()) {
490
            $form = new SurveyForm();
491
            $dataPost = $request->getPost()->toArray();
492
            $dataPost['status'] = isset($dataPost['status']) ? $dataPost['status'] : SurveyForm::STATUS_INACTIVE;
493
 
494
            $form->setData($dataPost);
495
 
496
            if ($form->isValid()) {
497
                $dataPost = (array) $form->getData();
498
 
499
                $hydrator = new ObjectPropertyHydrator();
500
                $hydrator->hydrate($dataPost, $survey);
501
 
502
                if (!$survey->status) {
503
                    $survey->status = Survey::STATUS_INACTIVE;
504
                }
4749 eleazar 505
 
506
                $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
507
                $surveyForm = $surveyFormMapper->fetchOneByUuid($dataPost['form_id']);
508
                $survey->form_id = $surveyForm->id;
509
 
4579 eleazar 510
                $result = $surveyMapper->update($survey);
511
 
512
                if ($result) {
513
                    $this->logger->info('Se edito la encuesta ' . $survey->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
514
                    $data = [
515
                        'success' => true,
516
                        'id' => $survey->id,
517
                        'action_edit' => $this->url()->fromRoute('survey/edit', ['id' => $survey->uuid]),
518
                        'data' => 'LABEL_RECORD_UPDATED'
519
                    ];
520
                } else {
521
                    $data = [
522
                        'success' => false,
523
                        'data' => $surveyMapper->getError()
524
                    ];
525
                }
526
 
527
                return new JsonModel($data);
528
            } else {
529
                $messages = [];
530
                $form_messages = (array) $form->getMessages();
531
                foreach ($form_messages as $fieldname => $field_messages) {
532
                    $messages[$fieldname] = array_values($field_messages);
533
                }
534
 
535
                return new JsonModel([
536
                    'success' => false,
537
                    'data' => $messages
538
                ]);
539
            }
540
        } else if ($request->isGet()) {
541
            $hydrator = new ObjectPropertyHydrator();
542
 
4749 eleazar 543
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
544
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
545
 
4579 eleazar 546
            $data = [
547
                'success' => true,
548
                'data' => [
4653 eleazar 549
                    'name' => $survey->name,
4749 eleazar 550
                    'form_id' => $surveyForm->uuid,
4653 eleazar 551
                    'target' => $survey->target,
552
                    'identity' => $survey->identity,
553
                    'since_date' => $survey->since_date,
554
                    'last_date' => $survey->last_date,
555
                    'status' => $survey->status,
4579 eleazar 556
                ]
557
            ];
558
 
559
            return new JsonModel($data);
560
        } else {
561
            $data = [
562
                'success' => false,
563
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
564
            ];
565
 
566
            return new JsonModel($data);
567
        }
568
 
569
        return new JsonModel($data);
570
    }
571
 
572
    public function deleteAction() {
573
        $request = $this->getRequest();
574
        $currentUserPlugin = $this->plugin('currentUserPlugin');
575
        $currentCompany = $currentUserPlugin->getCompany();
576
        $currentUser = $currentUserPlugin->getUser();
577
 
578
        $request = $this->getRequest();
579
        $uuid = $this->params()->fromRoute('id');
580
 
581
        if (!$uuid) {
582
            $data = [
583
                'success' => false,
584
                'data' => 'ERROR_INVALID_PARAMETER'
585
            ];
586
 
587
            return new JsonModel($data);
588
        }
589
 
590
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
591
        $survey = $surveyMapper->fetchOneByUuid($uuid);
592
        if (!$survey) {
593
            $data = [
594
                'success' => false,
595
                'data' => 'ERROR_RECORD_NOT_FOUND'
596
            ];
597
 
598
            return new JsonModel($data);
599
        }
600
 
601
        if ($survey->company_id != $currentCompany->id) {
602
            return new JsonModel([
603
                'success' => false,
604
                'data' => 'ERROR_UNAUTHORIZED'
605
            ]);
606
        }
607
 
608
        if ($request->isPost()) {
609
 
610
            $result = $surveyMapper->delete($survey->id);
611
            if ($result) {
4735 eleazar 612
                //$this->logger->info('Se borro la encuesta ' . $survey->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
4579 eleazar 613
 
614
                $data = [
615
                    'success' => true,
616
                    'data' => 'LABEL_RECORD_DELETED'
617
                ];
618
            } else {
619
 
620
                $data = [
621
                    'success' => false,
622
                    'data' => $surveyMapper->getError()
623
                ];
624
 
625
                return new JsonModel($data);
626
            }
627
        } else {
628
            $data = [
629
                'success' => false,
630
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
631
            ];
632
 
633
            return new JsonModel($data);
634
        }
635
 
636
        return new JsonModel($data);
637
    }
638
 
4384 eleazar 639
}