Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16768 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
16766 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
use LeadersLinked\Cache\CacheInterface;
8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
12
use LeadersLinked\Model\PlanningTask;
13
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
14
use LeadersLinked\Form\Planning\PlanningTaskForm;
15
use LeadersLinked\Library\Functions;
16
use LeadersLinked\Mapper\PlanningTaskMapper;
17
use LeadersLinked\Model\PlanningTaskMembers;
18
use LeadersLinked\Mapper\PlanningTaskMembersMapper;
19
use LeadersLinked\Mapper\PlanningGoalsMapper;
20
use LeadersLinked\Mapper\PlanningObjectivesMapper;
21
use LeadersLinked\Mapper\CompanyUserMapper;
22
use LeadersLinked\Mapper\UserMapper;
23
 
24
class PlanningTaskController extends AbstractActionController
25
{
26
    /**
27
     *
28
     * @var AdapterInterface
29
     */
30
    private $adapter;
31
 
32
 
33
    /**
34
     *
35
     * @var CacheInterface
36
     */
37
    private $cache;
38
 
39
    /**
40
     *
41
     * @var  LoggerInterface
42
     */
43
    private $logger;
44
 
45
    /**
46
     *
47
     * @var array
48
     */
49
    private $config;
50
 
51
 
52
 
53
    /**
54
     *
55
     * @param AdapterInterface $adapter
56
     *@param CacheInterface $cache
57
     * @param LoggerInterface $logger
58
     * @param array $config
59
     */
60
    public function __construct($adapter, $cache , $logger, $config)
61
    {
62
        $this->adapter      = $adapter;
63
        $this->cache        = $cache;
64
        $this->logger       = $logger;
65
        $this->config       = $config;
66
 
67
 
68
    }
69
 
70
 
71
 
72
    public function indexAction()
73
    {
74
        $currentUserPlugin = $this->plugin('currentUserPlugin');
75
        $currentUser = $currentUserPlugin->getUser();
76
        $currentCompany = $currentUserPlugin->getCompany();
77
 
78
 
79
        $objective_uuid = $this->params()->fromRoute('objective_id');
80
        $goal_uuid= $this->params()->fromRoute('goal_id');
81
        $request = $this->getRequest();
82
 
83
        if($request->isGet()) {
84
 
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
 
104
            if($isJson) {
105
 
106
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
107
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/goals/task/edit');
108
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/goals/task/delete');
109
                $allowView = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/goals/task/view');
110
 
111
                $search = $this->params()->fromQuery('search', []);
112
                $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
113
 
114
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
115
                $page               = (intval($this->params()->fromQuery('start', 1), 10)/$records_x_page)+1;
116
                $order =  $this->params()->fromQuery('order', []);
117
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
118
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(Functions::sanitizeFilterString($order[0]['dir']));
119
 
120
                $fields =  ['title'];
121
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';
122
 
123
                if(!in_array($order_direction, ['ASC', 'DESC'])) {
124
                    $order_direction = 'ASC';
125
                }
126
 
127
                $planningObjectivesMapper = PlanningObjectivesMapper::getInstance($this->adapter);
128
                $objective = $planningObjectivesMapper->fetchOneByUuid($objective_uuid);
129
 
130
                if (!$objective) {
131
                    $data = [
132
                        'success' => false,
133
                        'data' => 'ERROR_RECORD_NOT_FOUND'
134
                    ];
135
 
136
 
137
                        return new JsonModel($data);
138
 
139
                }else{
140
                    if($objective->company_id==$currentCompany->id){
141
                        $planningGoalsMapper = PlanningGoalsMapper::getInstance($this->adapter);
142
                        $goals = $planningGoalsMapper->fetchOneByUuid($goal_uuid);
143
 
144
                        if(!$goals){
145
                            $data = [
146
                                'success' => false,
147
                                'data' => 'ERROR_RECORD_NOT_FOUND'
148
                            ];
149
 
150
 
151
                                return new JsonModel($data);
152
                        }
153
                    }else{
154
                        $data = [
155
                            'success' => false,
156
                            'data' => 'ERROR_UNAUTHORIZED',
157
                        ];
158
 
159
                            return new JsonModel($data);
160
                    }
161
 
162
 
163
 
164
                }
165
 
166
 
167
                $planningTaskMapper = PlanningTaskMapper::getInstance($this->adapter);
168
                $paginator = $planningTaskMapper->fetchAllDataTable($search, $page, $records_x_page, $order_field, $order_direction, $goals->id);
169
 
170
                $items = [];
171
 
172
                $records = $paginator->getCurrentItems();
173
 
174
 
175
                foreach($records as $record)
176
                {
177
 
178
                    $item = [
179
                        'title' => $record->title,
180
                        'description' => $record->description,
181
                        'progress'=> $record->indicator,
182
                        'cost'=> $record->cost,
183
                        'status' => $record->status,
184
                        'actions' => [
185
                            'link_edit' => $allowEdit ? $this->url()->fromRoute('planning/objectives/goals/task/edit', ['objective_id' => $objective_uuid,'goal_id' => $goal_uuid,'id' => $record->uuid]) : '',
186
                            'link_delete' => $allowDelete ? $this->url()->fromRoute('planning/objectives/goals/task/delete', ['objective_id' => $objective_uuid,'goal_id' => $goal_uuid,'id' => $record->uuid]) : ''
187
                            ]
188
 
189
                    ];
190
                    array_push($items, $item);
191
                }
192
 
193
                $recordsTask = $planningTaskMapper->fetchAll($goals->id);
194
 
195
 
196
                $costGoals=0;
197
                $indicatorGoals=0;
198
 
199
                foreach($recordsTask as $record)
200
                {
201
                    $indicatorGoals=$indicatorGoals+$record->indicator;
202
                    $costGoals=$costGoals+$record->cost;
203
                }
204
                $countRecordsTask = count($recordsTask);
205
                if($countRecordsTask >0){
206
 
207
                    $indicatorGoals=round($indicatorGoals/$countRecordsTask, 2);
208
                }else{
209
                    $indicatorGoals=-1;
210
                }
211
 
212
 
213
 
214
                return new JsonModel([
215
                    'success' => true,
216
                    'data' => [
217
                        'items' => $items,
218
                        'total' => $paginator->getTotalItemCount(),
219
                        'goals' => [
220
                            'titleGoals' =>$goals->title,
221
                            'descriptionGoals' =>$goals->description,
222
                            'costGoals'=>'$'.$costGoals,
223
                            'indicatorGoals'=> $indicatorGoals,
224
                            'statusGoals'=> $goals->status=='a'?'LABEL_ACTIVE':'LABEL_INACTIVE',
225
 
226
                        ]
227
                    ]
228
                ]);
229
            } else  {
230
                $formAdd = new PlanningTaskForm($this->adapter, $currentCompany->id);
231
                $this->layout()->setTemplate('layout/layout-backend');
232
                $viewModel = new ViewModel();
233
                $viewModel->setTemplate('leaders-linked/planning-tasks/index.phtml');
234
                $viewModel->setVariables([
235
                    'formAdd' => $formAdd,
236
                    'objective_uuid'=> $objective_uuid,
237
                    'goal_uuid'=> $goal_uuid,
238
 
239
 
240
                ]);
241
                return $viewModel ;
242
            }
243
        } else {
244
            return new JsonModel([
245
                'success' => false,
246
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
247
            ]);
248
        }
249
    }
250
    public function addAction()
251
    {
252
      $currentUserPlugin = $this->plugin('currentUserPlugin');
253
        $currentUser = $currentUserPlugin->getUser();
254
        $currentCompany = $currentUserPlugin->getCompany();
255
        $objective_uuid = $this->params()->fromRoute('objective_id');
256
        $goal_uuid = $this->params()->fromRoute('goal_id');
257
        $request = $this->getRequest();
258
        $planningObjectivesMapper = PlanningObjectivesMapper::getInstance($this->adapter);
259
        $objective = $planningObjectivesMapper->fetchOneByUuid($objective_uuid);
260
 
261
        if (!$objective) {
262
            $data = [
263
                'success' => false,
264
                'data' => 'ERROR_RECORD_NOT_FOUND'
265
            ];
266
 
267
 
268
                return new JsonModel($data);
269
 
270
        }else{
271
            if($objective->company_id==$currentCompany->id){
272
                $planningGoalsMapper = PlanningGoalsMapper::getInstance($this->adapter);
273
                $goals = $planningGoalsMapper->fetchOneByUuid($goal_uuid);
274
 
275
                if(!$goals){
276
                    $data = [
277
                        'success' => false,
278
                        'data' => 'ERROR_RECORD_NOT_FOUND'
279
                    ];
280
 
281
 
282
                        return new JsonModel($data);
283
                }
284
            }else{
285
                $data = [
286
                    'success' => false,
287
                    'data' => 'ERROR_UNAUTHORIZED',
288
                ];
289
 
290
                    return new JsonModel($data);
291
            }
292
 
293
        }
294
        if($request->isPost()) {
295
 
296
            $form = new  PlanningTaskForm($this->adapter, $currentCompany->id);
297
            $dataPost = $request->getPost()->toArray();
298
            $dataPost['status'] =  isset($dataPost['status']) ? $dataPost['status'] : PlanningTask::STATUS_INACTIVE;
299
            if($dataPost['indicator']!=100){
300
                $dataPost['evaluation']='';
301
                $dataPost['detour']='';
302
            }
303
            $form->setData($dataPost);
304
 
305
            if($form->isValid()) {
306
 
307
 
308
 
309
                $dataPost = (array) $form->getData();
310
                $dataPost['goal_id']=$goals->id;
311
 
312
                $hydrator = new ObjectPropertyHydrator();
313
                $planningTask = new PlanningTask();
314
                $hydrator->hydrate($dataPost, $planningTask);
315
 
316
                $planningTaskMapper = PlanningTaskMapper::getInstance($this->adapter);
317
                $result = $planningTaskMapper->insert($planningTask);
318
 
319
 
320
                if($result) {
321
                    $userMapper = UserMapper::getInstance($this->adapter);
322
 
323
                    foreach( $dataPost['who'] as $record2){
324
                        $PlanningTaskMember = new PlanningTaskMembers();
325
                        $datosUser = $userMapper->fetchOneByUuid($record2);
326
                        $PlanningTaskMember->task_id = $planningTask->id;
327
                        $PlanningTaskMember->user_id = $datosUser->id;
328
                        $PlanningTaskMember->status = PlanningTaskMembers::STATUS_ACTIVE;
329
                        $PlanningTaskMemberMapper = PlanningTaskMembersMapper::getInstance($this->adapter);
330
                        $PlanningTaskMemberMapper->insert($PlanningTaskMember);
331
                    }
332
 
333
 
334
                    $this->logger->info('Se agrego la tarea ' . $planningTask->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
335
 
336
                    $data = [
337
                        'success'   => true,
338
                        'data'   => 'LABEL_RECORD_ADDED'
339
                    ];
340
                } else {
341
                    $data = [
342
                        'success'   => false,
343
                        'data'      => $planningTaskMapper->getError()
344
                    ];
345
 
346
                }
347
 
348
                return new JsonModel($data);
349
 
350
            } else {
351
                $messages = [];
352
                $form_messages = (array) $form->getMessages();
353
                foreach($form_messages  as $fieldname => $field_messages)
354
                {
355
 
356
                    $messages[$fieldname] = array_values($field_messages);
357
                }
358
 
359
                return new JsonModel([
360
                    'success'   => false,
361
                    'data'   => $messages
362
                ]);
363
            }
364
 
365
        }else if ($request->isGet()) {
366
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
367
            $userMapper = UserMapper::getInstance($this->adapter);
368
            $datosCompanyUser = $companyUserMapper->fetchAllByCompanyId($currentCompany->id);
369
 
370
            $users=[];
371
 
372
            foreach($datosCompanyUser as $record){
373
                $datosUser = $userMapper->fetchOne($record->user_id);
374
 
375
                    $user=[
376
                        'uuid'=>$datosUser->uuid,
377
                        'email'=>$datosUser->email,
378
                        'first_name'=>$datosUser->first_name,
379
                        'last_name'=>$datosUser->last_name,
380
 
381
                    ];
382
                    array_push($users, $user);
383
 
384
            }
385
 
386
            return new JsonModel([
387
                'success' => true,
388
                'data' => $users
389
 
390
            ]);
391
        } else {
392
            $data = [
393
                'success' => false,
394
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
395
            ];
396
 
397
            return new JsonModel($data);
398
        }
399
 
400
        return new JsonModel($data);
401
 
402
    }
403
 
404
 
405
 
406
     public function editAction(){
407
 
408
 
409
        $currentUserPlugin = $this->plugin('currentUserPlugin');
410
        $currentUser = $currentUserPlugin->getUser();
411
        $currentCompany = $currentUserPlugin->getCompany();
412
        $request = $this->getRequest();
413
        $uuid = $this->params()->fromRoute('id');
414
 
415
 
416
        if(!$uuid) {
417
            $data = [
418
                'success'   => false,
419
                'data'   => 'ERROR_INVALID_PARAMETER'
420
            ];
421
 
422
            return new JsonModel($data);
423
        }
424
 
425
        $objective_uuid = $this->params()->fromRoute('objective_id');
426
        $goal_uuid = $this->params()->fromRoute('goal_id');
427
        $currentUserPlugin = $this->plugin('currentUserPlugin');
428
        $currentCompany = $currentUserPlugin->getCompany();
429
        $planningObjectivesMapper = PlanningObjectivesMapper::getInstance($this->adapter);
430
        $objective = $planningObjectivesMapper->fetchOneByUuid($objective_uuid);
431
 
432
        if (!$objective) {
433
            $data = [
434
                'success' => false,
435
                'data' => 'ERROR_RECORD_NOT_FOUND'
436
            ];
437
 
438
 
439
                return new JsonModel($data);
440
 
441
        }else{
442
            if($objective->company_id==$currentCompany->id){
443
                $planningGoalsMapper = PlanningGoalsMapper::getInstance($this->adapter);
444
                $goals = $planningGoalsMapper->fetchOneByUuid($goal_uuid);
445
 
446
                if(!$goals){
447
                    $data = [
448
                        'success' => false,
449
                        'data' => 'ERROR_RECORD_NOT_FOUND'
450
                    ];
451
 
452
 
453
                        return new JsonModel($data);
454
                }
455
            }else{
456
                $data = [
457
                    'success' => false,
458
                    'data' => 'ERROR_UNAUTHORIZED',
459
                ];
460
 
461
                    return new JsonModel($data);
462
            }
463
 
464
 
465
 
466
        }
467
        $planningTaskMapper = PlanningTaskMapper::getInstance($this->adapter);
468
        $task = $planningTaskMapper->fetchOneByUuid($uuid);
469
 
470
        if (!$task) {
471
            $data = [
472
                'success' => false,
473
                'data' => 'ERROR_RECORD_NOT_FOUND'
474
            ];
475
 
476
            return new JsonModel($data);
477
        }
478
 
479
 
480
        if($request->isPost()) {
481
            $form = new  PlanningTaskForm($this->adapter, $currentCompany->id);
482
            $dataPost = $request->getPost()->toArray();
483
            $dataPost['status'] =  isset($dataPost['status']) ? $dataPost['status'] : PlanningTask::STATUS_INACTIVE;
484
            $form->setData($dataPost);
485
 
486
            if($form->isValid()) {
487
                $dataPost = (array) $form->getData();
488
 
489
                $hydrator = new ObjectPropertyHydrator();
490
                $hydrator->hydrate($dataPost, $task);
491
                $result = $planningTaskMapper->update($task);
492
 
493
                if($result) {
494
 
495
                    $userMapper = UserMapper::getInstance($this->adapter);
496
                    $PlanningTaskMemberMapper = PlanningTaskMembersMapper::getInstance($this->adapter);
497
                    $PlanningTaskMemberMapper->dissableMembersTask($task->id);
498
 
499
                    foreach( $dataPost['who'] as $record2){
500
                        $PlanningTaskMember = new PlanningTaskMembers();
501
                        $datosUser = $userMapper->fetchOneByUuid($record2);
502
                        $PlanningTaskMember->task_id = $task->id;
503
                        $PlanningTaskMember->user_id = $datosUser->id;
504
                        $PlanningTaskMember->status = PlanningTaskMembers::STATUS_ACTIVE;
505
                        $PlanningTaskMemberMapper->insert($PlanningTaskMember);
506
                    }
507
 
508
 
509
 
510
                    $this->logger->info('Se actualizo la tarea ' . $task->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
511
 
512
                    $data = [
513
                        'success' => true,
514
                        'data' => 'LABEL_RECORD_UPDATED'
515
                    ];
516
                } else {
517
                    $data = [
518
                        'success'   => false,
519
                        'data'      => $planningTaskMapper->getError()
520
                    ];
521
                }
522
 
523
                return new JsonModel($data);
524
 
525
            } else {
526
                $messages = [];
527
                $form_messages = (array) $form->getMessages();
528
                foreach($form_messages  as $fieldname => $field_messages)
529
                {
530
                    $messages[$fieldname] = array_values($field_messages);
531
                }
532
 
533
                return new JsonModel([
534
                    'success'   => false,
535
                    'data'   => $messages
536
                ]);
537
            }
538
        }else if ($request->isGet()) {
539
            $hydrator = new ObjectPropertyHydrator();
540
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
541
            $userMapper = UserMapper::getInstance($this->adapter);
542
            $datosCompanyUser = $companyUserMapper->fetchAllByCompanyId($currentCompany->id);
543
 
544
            $allUsers=[];
545
 
546
            foreach($datosCompanyUser as $record){
547
                $datosUser = $userMapper->fetchOne($record->user_id);
548
 
549
                    $allUser=[
550
                        'uuid'=>$datosUser->uuid,
551
                        'email'=>$datosUser->email,
552
                        'first_name'=>$datosUser->first_name,
553
                        'last_name'=>$datosUser->last_name,
554
 
555
                    ];
556
                    array_push($allUsers, $allUser);
557
 
558
            }
559
            $PlanningTaskMemberMapper = PlanningTaskMembersMapper::getInstance($this->adapter);
560
            $datosUsuarios = $PlanningTaskMemberMapper->fetchAll($task->id);
561
            $users=[];
562
            foreach($datosUsuarios as $record){
563
                $datosUser = $userMapper->fetchOne($record->user_id);
564
 
565
                    $user=[
566
                        'uuid'=>$datosUser->uuid,
567
                    ];
568
                    array_push($users, $user);
569
            }
570
 
571
            $data = [
572
                'success' => true,
573
                'data' => $hydrator->extract($task),
574
                'all_users'=> $allUsers,
575
                'users'=> $users
576
            ];
577
 
578
            return new JsonModel($data);
579
        } else {
580
            $data = [
581
                'success' => false,
582
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
583
            ];
584
 
585
            return new JsonModel($data);
586
        }
587
 
588
        return new JsonModel($data);
589
 
590
    }
591
 
592
 
593
 
594
 
595
    public function deleteAction(){
596
        $currentUserPlugin = $this->plugin('currentUserPlugin');
597
        $currentCompany = $currentUserPlugin->getCompany();
598
        $currentUser = $currentUserPlugin->getUser();
599
 
600
        $request = $this->getRequest();
601
        $uuid = $this->params()->fromRoute('id');
602
 
603
 
604
        if (!$uuid) {
605
            $data = [
606
                'success' => false,
607
                'data' => 'ERROR_INVALID_PARAMETER'
608
            ];
609
 
610
            return new JsonModel($data);
611
        }
612
        $objective_uuid = $this->params()->fromRoute('objective_id');
613
        $goal_uuid = $this->params()->fromRoute('goal_id');
614
        $currentUserPlugin = $this->plugin('currentUserPlugin');
615
        $currentCompany = $currentUserPlugin->getCompany();
616
        $planningObjectivesMapper = PlanningObjectivesMapper::getInstance($this->adapter);
617
        $objective = $planningObjectivesMapper->fetchOneByUuid($objective_uuid);
618
 
619
        if (!$objective) {
620
            $data = [
621
                'success' => false,
622
                'data' => 'ERROR_RECORD_NOT_FOUND'
623
            ];
624
                return new JsonModel($data);
625
 
626
        }else{
627
            if($objective->company_id==$currentCompany->id){
628
                $planningGoalsMapper = PlanningGoalsMapper::getInstance($this->adapter);
629
                $goals = $planningGoalsMapper->fetchOneByUuid($goal_uuid);
630
 
631
                if(!$goals){
632
                    $data = [
633
                        'success' => false,
634
                        'data' => 'ERROR_RECORD_NOT_FOUND'
635
                    ];
636
 
637
 
638
                        return new JsonModel($data);
639
                }
640
            }else{
641
                $data = [
642
                    'success' => false,
643
                    'data' => 'ERROR_UNAUTHORIZED',
644
                ];
645
 
646
                    return new JsonModel($data);
647
            }
648
 
649
        }
650
        $planningTaskMapper = PlanningTaskMapper::getInstance($this->adapter);
651
        $task = $planningTaskMapper->fetchOneByUuid($uuid);
652
 
653
        if (!$task) {
654
            $data = [
655
                'success' => false,
656
                'data' => 'ERROR_RECORD_NOT_FOUND'
657
            ];
658
 
659
            return new JsonModel($data);
660
        }
661
 
662
 
663
        if ($request->isPost()) {
664
 
665
 
666
            $result = $planningTaskMapper->delete($task->id);
667
            if ($result) {
668
                $this->logger->info('Se borro la tarea con el titulo ' . $task->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
669
 
670
                $data = [
671
                    'success' => true,
672
                    'data' => 'LABEL_RECORD_DELETED'
673
                ];
674
            } else {
675
 
676
                $data = [
677
                    'success' => false,
678
                    'data' => $planningTaskMapper->getError()
679
                ];
680
 
681
                return new JsonModel($data);
682
            }
683
        } else {
684
            $data = [
685
                'success' => false,
686
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
687
            ];
688
 
689
            return new JsonModel($data);
690
        }
691
 
692
        return new JsonModel($data);
693
    }
694
 
695
 
696
 
697
 
698
}