Proyectos de Subversion LeadersLinked - Backend

Rev

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