Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
66 efrain 1
<?php
649 geraldo 2
 
66 efrain 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 LeadersLinked\Hydrator\ObjectPropertyHydrator;
11
use Laminas\Log\LoggerInterface;
12
use Laminas\View\Model\ViewModel;
13
use Laminas\View\Model\JsonModel;
14
use LeadersLinked\Library\Functions;
804 geraldo 15
use LeadersLinked\Mapper\CompanyMapper;
66 efrain 16
use LeadersLinked\Mapper\JobDescriptionMapper;
17
use LeadersLinked\Mapper\CompetencyTypeMapper;
18
use LeadersLinked\Model\JobDescription;
19
use LeadersLinked\Form\JobDescriptionForm;
20
use LeadersLinked\Mapper\CompetencyMapper;
567 geraldo 21
use LeadersLinked\Library\JobPDF;
66 efrain 22
use LeadersLinked\Mapper\JobDescriptionCompetencyMapper;
23
use LeadersLinked\Mapper\JobDescriptionSubordinateMapper;
24
use LeadersLinked\Model\JobDescriptionCompetency;
25
use LeadersLinked\Model\JobDescriptionSubordinate;
26
 
649 geraldo 27
class JobDescriptionController extends AbstractActionController {
66 efrain 28
 
29
    /**
30
     *
31
     * @var AdapterInterface
32
     */
33
    private $adapter;
649 geraldo 34
 
66 efrain 35
    /**
36
     *
37
     * @var AbstractAdapter
38
     */
39
    private $cache;
649 geraldo 40
 
66 efrain 41
    /**
42
     *
43
     * @var  LoggerInterface
44
     */
45
    private $logger;
46
 
47
    /**
48
     *
49
     * @var array
50
     */
51
    private $config;
649 geraldo 52
 
66 efrain 53
    /**
54
     *
55
     * @param AdapterInterface $adapter
56
     * @param AbstractAdapter $cache
57
     * @param LoggerInterface $logger
58
     * @param array $config
59
     */
649 geraldo 60
    public function __construct($adapter, $cache, $logger, $config) {
61
        $this->adapter = $adapter;
62
        $this->cache = $cache;
63
        $this->logger = $logger;
64
        $this->config = $config;
66 efrain 65
    }
649 geraldo 66
 
67
    public function indexAction() {
66 efrain 68
        $currentUserPlugin = $this->plugin('currentUserPlugin');
69
        $currentUser = $currentUserPlugin->getUser();
70
        $currentCompany = $currentUserPlugin->getCompany();
649 geraldo 71
 
66 efrain 72
        $request = $this->getRequest();
649 geraldo 73
 
74
        $headers = $request->getHeaders();
75
 
66 efrain 76
        $request = $this->getRequest();
649 geraldo 77
        if ($request->isGet()) {
78
 
79
 
80
            $headers = $request->getHeaders();
81
 
66 efrain 82
            $isJson = false;
649 geraldo 83
            if ($headers->has('Accept')) {
66 efrain 84
                $accept = $headers->get('Accept');
649 geraldo 85
 
66 efrain 86
                $prioritized = $accept->getPrioritized();
649 geraldo 87
 
88
                foreach ($prioritized as $key => $value) {
66 efrain 89
                    $raw = trim($value->getRaw());
649 geraldo 90
 
91
                    if (!$isJson) {
66 efrain 92
                        $isJson = strpos($raw, 'json');
93
                    }
94
                }
95
            }
649 geraldo 96
 
97
            if ($isJson) {
66 efrain 98
                $search = $this->params()->fromQuery('search', []);
99
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
649 geraldo 100
 
101
                $page = intval($this->params()->fromQuery('start', 1), 10);
102
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
103
                $order = $this->params()->fromQuery('order', []);
104
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
105
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
106
 
107
                $fields = ['name'];
66 efrain 108
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
649 geraldo 109
 
110
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
66 efrain 111
                    $order_direction = 'ASC';
112
                }
649 geraldo 113
 
66 efrain 114
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
115
 
842 geraldo 116
                if ($currentCompany) {
117
                    $paginator = $jobDescriptionMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
118
                } else {
119
                    $paginator = $jobDescriptionMapper->fetchAllDataTable($search, $page, $records_x_page, $order_field, $order_direction);
840 geraldo 120
                }
66 efrain 121
                $items = [];
122
                $records = $paginator->getCurrentItems();
649 geraldo 123
                foreach ($records as $record) {
124
 
125
 
126
 
66 efrain 127
                    $item = [
128
                        'name' => $record->name,
129
                        'status' => $record->status,
130
                        'actions' => [
649 geraldo 131
                            'link_report' => $this->url()->fromRoute('settings/jobs-description/report', ['id' => $record->uuid]),
132
                            'link_edit' => $this->url()->fromRoute('settings/jobs-description/edit', ['id' => $record->uuid]),
133
                            'link_delete' => $this->url()->fromRoute('settings/jobs-description/delete', ['id' => $record->uuid])
134
                        ]
66 efrain 135
                    ];
649 geraldo 136
 
66 efrain 137
                    array_push($items, $item);
138
                }
649 geraldo 139
 
66 efrain 140
                return new JsonModel([
141
                    'success' => true,
142
                    'data' => [
143
                        'items' => $items,
144
                        'total' => $paginator->getTotalItemCount(),
145
                    ]
146
                ]);
649 geraldo 147
            } else {
148
 
847 geraldo 149
                $form = new JobDescriptionForm($this->adapter, $currentCompany ? $currentCompany->id : null);
842 geraldo 150
 
66 efrain 151
                $this->layout()->setTemplate('layout/layout-backend');
152
                $viewModel = new ViewModel();
153
                $viewModel->setTemplate('leaders-linked/jobs-description/index.phtml');
154
                $viewModel->setVariable('form', $form);
649 geraldo 155
                return $viewModel;
156
            }
66 efrain 157
        } else {
158
            return new JsonModel([
159
                'success' => false,
160
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
649 geraldo 161
            ]);
162
            ;
66 efrain 163
        }
164
    }
649 geraldo 165
 
166
    public function addAction() {
66 efrain 167
        $currentUserPlugin = $this->plugin('currentUserPlugin');
168
        $currentUser = $currentUserPlugin->getUser();
169
        $currentCompany = $currentUserPlugin->getCompany();
649 geraldo 170
 
66 efrain 171
        $request = $this->getRequest();
649 geraldo 172
 
173
 
174
        if ($request->isGet()) {
175
 
66 efrain 176
            $data = [
649 geraldo 177
                'competency_types' => [],
178
                'competencies' => [],
179
                'jobs_description' => [],
66 efrain 180
            ];
649 geraldo 181
 
66 efrain 182
            $competencyTypeMapper = CompetencyTypeMapper::getInstance($this->adapter);
649 geraldo 183
 
856 geraldo 184
            $records = $currentCompany ?
185
                    $competencyTypeMapper->fetchAllByCompanyId($currentCompany->id) :
186
                    $competencyTypeMapper->fetchAllActivesByDefault();
842 geraldo 187
 
856 geraldo 188
            $competencyTypesUUID = [];
189
            foreach ($records as $record) {
190
                array_push($data['competency_types'], [
191
                    'competency_type_id' => $record->uuid,
192
                    'name' => $record->name,
193
                ]);
649 geraldo 194
 
856 geraldo 195
                $competencyTypesUUID[$record->id] = $record->uuid;
196
            }
66 efrain 197
 
649 geraldo 198
 
856 geraldo 199
            $competencyMapper = CompetencyMapper::getInstance($this->adapter);
844 geraldo 200
 
856 geraldo 201
            $records = $currentCompany ?
202
                    $competencyMapper->fetchAllActiveByCompanyId($currentCompany->id) :
203
                    $competencyMapper->fetchAllByDefault();
844 geraldo 204
 
856 geraldo 205
            foreach ($records as $record) {
206
                if (isset($competencyTypesUUID[$record->competency_type_id])) {
649 geraldo 207
 
856 geraldo 208
                    array_push($data['competencies'], [
209
                        'competency_type_id' => $competencyTypesUUID[$record->competency_type_id],
210
                        'competency_id' => $record->uuid,
211
                        'name' => $record->name,
212
                    ]);
66 efrain 213
                }
856 geraldo 214
            }
649 geraldo 215
 
856 geraldo 216
            $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
217
            $records = $currentCompany ?
218
                    $jobDescriptionMapper->fetchAllActiveByCompanyId($currentCompany->id) :
219
                    $jobDescriptionMapper->fetchAllByDefault();
649 geraldo 220
 
856 geraldo 221
            foreach ($records as $record) {
222
                array_push($data['jobs_description'], [
223
                    'job_description_id' => $record->uuid,
224
                    'name' => $record->name
225
                ]);
66 efrain 226
            }
649 geraldo 227
 
228
 
66 efrain 229
            $data = [
649 geraldo 230
                'success' => true,
231
                'data' => $data,
66 efrain 232
            ];
649 geraldo 233
 
234
 
66 efrain 235
            return new JsonModel($data);
649 geraldo 236
        } else if ($request->isPost()) {
854 geraldo 237
            $form = new JobDescriptionForm($this->adapter, $currentCompany ? $currentCompany->id : null);
66 efrain 238
            $dataPost = $request->getPost()->toArray();
649 geraldo 239
 
240
 
66 efrain 241
            $form->setData($dataPost);
649 geraldo 242
 
243
            if ($form->isValid()) {
66 efrain 244
                $dataPost = (array) $form->getData();
245
                $dataPost['status'] = $dataPost['status'] ? $dataPost['status'] : JobDescription::STATUS_INACTIVE;
649 geraldo 246
 
247
 
66 efrain 248
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
649 geraldo 249
 
250
                if (!empty($dataPost['job_description_id_boss'])) {
251
 
66 efrain 252
                    $jobDescriptionBoss = $jobDescriptionMapper->fetchOneByUuid($dataPost['job_description_id_boss']);
649 geraldo 253
                    if ($jobDescriptionBoss) {
847 geraldo 254
                        if ($jobDescriptionBoss->company_id == $currentCompany ? $currentCompany->id : null) {
66 efrain 255
                            $dataPost['job_description_id_boss'] = $jobDescriptionBoss->id;
256
                        } else {
257
                            $dataPost['job_description_id_boss'] = null;
258
                        }
259
                    } else {
260
                        $dataPost['job_description_id_boss'] = null;
261
                    }
262
                }
263
 
264
                $hydrator = new ObjectPropertyHydrator();
265
                $jobDescription = new JobDescription();
649 geraldo 266
 
66 efrain 267
                $hydrator->hydrate($dataPost, $jobDescription);
649 geraldo 268
 
269
                if ($currentCompany) {
847 geraldo 270
                    $jobDescription->company_id = $currentCompany ? $currentCompany->id : null;
66 efrain 271
                }
272
 
649 geraldo 273
 
66 efrain 274
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
275
                $result = $jobDescriptionMapper->insert($jobDescription);
649 geraldo 276
 
277
 
278
                if ($result) {
66 efrain 279
                    $jobDescriptionSubordinateMapper = JobDescriptionSubordinateMapper::getInstance($this->adapter);
280
                    $jobDescriptionSubordinateMapper->deleteAllByJobDescriptionIdTopLevel($jobDescription->id);
649 geraldo 281
 
66 efrain 282
                    $jobDescriptionCompetencyMapper = JobDescriptionCompetencyMapper::getInstance($this->adapter);
283
                    $jobDescriptionCompetencyMapper->deleteAllBJobDescriptionId($jobDescription->id);
649 geraldo 284
 
285
 
66 efrain 286
                    $competencyMapper = CompetencyMapper::getInstance($this->adapter);
847 geraldo 287
                    $competencies = $competencyMapper->fetchAllActiveByCompanyId($currentCompany ? $currentCompany->id : null);
649 geraldo 288
 
289
 
290
                    foreach ($competencies as $competency) {
66 efrain 291
                        $level = filter_var($this->params()->fromPost('competency_level' . $competency->uuid, ''), FILTER_SANITIZE_NUMBER_INT);
649 geraldo 292
                        if (in_array($level, [1, 2, 3, 4])) {
66 efrain 293
                            $jobDescriptionCompetency = new JobDescriptionCompetency();
294
                            $jobDescriptionCompetency->competency_id = $competency->id;
295
                            $jobDescriptionCompetency->job_description_id = $jobDescription->id;
296
                            $jobDescriptionCompetency->level = $level;
297
                            $jobDescriptionCompetencyMapper->insert($jobDescriptionCompetency);
298
                        }
299
                    }
649 geraldo 300
 
301
 
848 geraldo 302
                    $jobsDescriptionListingSubordinate = $jobDescriptionMapper->fetchAllActiveByCompanyIdWhereIdNotEqual($currentCompany ? $currentCompany->id : null, $jobDescription->id);
649 geraldo 303
                    foreach ($jobsDescriptionListingSubordinate as $jobDescriptionListingSubordinate) {
66 efrain 304
                        $job_description_subordinate = filter_var($this->params()->fromPost('job_description_id_subordinate' . $jobDescriptionListingSubordinate->uuid, ''), FILTER_SANITIZE_STRING);
649 geraldo 305
                        if ($job_description_subordinate) {
66 efrain 306
                            $jobDescriptionSubordinate = new JobDescriptionSubordinate();
307
                            $jobDescriptionSubordinate->job_description_id_top_level = $jobDescription->id;
308
                            $jobDescriptionSubordinate->job_description_id_low_level = $jobDescriptionListingSubordinate->id;
309
                            $jobDescriptionSubordinateMapper->insert($jobDescriptionSubordinate);
310
                        }
311
                    }
649 geraldo 312
 
313
 
314
 
66 efrain 315
                    $this->logger->info('Se agrego el cargo ' . $jobDescription->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
649 geraldo 316
 
66 efrain 317
                    $data = [
649 geraldo 318
                        'success' => true,
319
                        'data' => 'LABEL_RECORD_ADDED'
66 efrain 320
                    ];
321
                } else {
322
                    $data = [
649 geraldo 323
                        'success' => false,
324
                        'data' => $jobDescriptionMapper->getError()
66 efrain 325
                    ];
326
                }
649 geraldo 327
 
66 efrain 328
                return new JsonModel($data);
329
            } else {
330
                $messages = [];
331
                $form_messages = (array) $form->getMessages();
649 geraldo 332
                foreach ($form_messages as $fieldname => $field_messages) {
333
 
66 efrain 334
                    $messages[$fieldname] = array_values($field_messages);
335
                }
649 geraldo 336
 
66 efrain 337
                return new JsonModel([
649 geraldo 338
                    'success' => false,
339
                    'data' => $messages
66 efrain 340
                ]);
341
            }
342
        } else {
343
            $data = [
344
                'success' => false,
345
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
346
            ];
649 geraldo 347
 
66 efrain 348
            return new JsonModel($data);
349
        }
649 geraldo 350
 
66 efrain 351
        return new JsonModel($data);
352
    }
649 geraldo 353
 
354
    public function editAction() {
66 efrain 355
        $currentUserPlugin = $this->plugin('currentUserPlugin');
356
        $currentUser = $currentUserPlugin->getUser();
357
        $currentCompany = $currentUserPlugin->getCompany();
649 geraldo 358
 
66 efrain 359
        $request = $this->getRequest();
360
        $uuid = $this->params()->fromRoute('id');
361
 
649 geraldo 362
 
363
        if (!$uuid) {
66 efrain 364
            $data = [
649 geraldo 365
                'success' => false,
366
                'data' => 'ERROR_INVALID_PARAMETER'
66 efrain 367
            ];
649 geraldo 368
 
66 efrain 369
            return new JsonModel($data);
370
        }
371
 
372
        $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
373
        $jobDescription = $jobDescriptionMapper->fetchOneByUuid($uuid);
649 geraldo 374
        if (!$jobDescription) {
66 efrain 375
            $data = [
649 geraldo 376
                'success' => false,
377
                'data' => 'ERROR_RECORD_NOT_FOUND'
66 efrain 378
            ];
649 geraldo 379
 
66 efrain 380
            return new JsonModel($data);
381
        }
649 geraldo 382
 
851 geraldo 383
        if ($currentCompany && $jobDescription->company_id != $currentCompany->id) {
66 efrain 384
            $data = [
649 geraldo 385
                'success' => false,
386
                'data' => 'ERROR_UNAUTHORIZED'
66 efrain 387
            ];
649 geraldo 388
 
66 efrain 389
            return new JsonModel($data);
390
        }
391
 
649 geraldo 392
 
393
        if ($request->isPost()) {
847 geraldo 394
            $form = new JobDescriptionForm($this->adapter, $currentCompany ? $currentCompany->id : null, $jobDescription->id);
66 efrain 395
            $dataPost = $request->getPost()->toArray();
649 geraldo 396
 
397
 
66 efrain 398
            $form->setData($dataPost);
649 geraldo 399
 
400
            if ($form->isValid()) {
66 efrain 401
                $dataPost = (array) $form->getData();
402
                $dataPost['status'] = $dataPost['status'] ? $dataPost['status'] : JobDescription::STATUS_INACTIVE;
649 geraldo 403
 
404
 
405
                if (!empty($dataPost['job_description_id_boss'])) {
406
 
66 efrain 407
                    $jobDescriptionBoss = $jobDescriptionMapper->fetchOneByUuid($dataPost['job_description_id_boss']);
649 geraldo 408
                    if ($jobDescriptionBoss) {
409
                        if ($jobDescriptionBoss->id != $jobDescription->id && $jobDescriptionBoss->company_id == $currentCompany->id) {
66 efrain 410
                            $dataPost['job_description_id_boss'] = $jobDescriptionBoss->id;
411
                        } else {
412
                            $dataPost['job_description_id_boss'] = null;
413
                        }
414
                    } else {
415
                        $dataPost['job_description_id_boss'] = null;
416
                    }
417
                }
649 geraldo 418
 
419
 
420
 
66 efrain 421
                $hydrator = new ObjectPropertyHydrator();
422
                $hydrator->hydrate($dataPost, $jobDescription);
423
 
424
                $result = $jobDescriptionMapper->update($jobDescription);
649 geraldo 425
 
426
                if ($result) {
427
 
66 efrain 428
                    $jobDescriptionSubordinateMapper = JobDescriptionSubordinateMapper::getInstance($this->adapter);
429
                    $jobDescriptionSubordinateMapper->deleteAllByJobDescriptionIdTopLevel($jobDescription->id);
649 geraldo 430
 
66 efrain 431
                    $jobDescriptionCompetencyMapper = JobDescriptionCompetencyMapper::getInstance($this->adapter);
432
                    $jobDescriptionCompetencyMapper->deleteAllBJobDescriptionId($jobDescription->id);
649 geraldo 433
 
434
 
66 efrain 435
                    $competencyMapper = CompetencyMapper::getInstance($this->adapter);
847 geraldo 436
                    $competencies = $competencyMapper->fetchAllActiveByCompanyId($currentCompany ? $currentCompany->id : null);
649 geraldo 437
 
438
 
439
                    foreach ($competencies as $competency) {
66 efrain 440
                        $level = filter_var($this->params()->fromPost('competency_level' . $competency->uuid, ''), FILTER_SANITIZE_NUMBER_INT);
649 geraldo 441
                        if (in_array($level, [1, 2, 3, 4])) {
66 efrain 442
                            $jobDescriptionCompetency = new JobDescriptionCompetency();
443
                            $jobDescriptionCompetency->competency_id = $competency->id;
444
                            $jobDescriptionCompetency->job_description_id = $jobDescription->id;
445
                            $jobDescriptionCompetency->level = $level;
446
                            $jobDescriptionCompetencyMapper->insert($jobDescriptionCompetency);
447
                        }
448
                    }
649 geraldo 449
 
450
 
847 geraldo 451
                    $jobsDescriptionListingSubordinate = $jobDescriptionMapper->fetchAllActiveByCompanyIdWhereIdNotEqual($currentCompany ? $currentCompany->id : null, $jobDescription->id);
649 geraldo 452
                    foreach ($jobsDescriptionListingSubordinate as $jobDescriptionListingSubordinate) {
66 efrain 453
                        $job_description_subordinate = filter_var($this->params()->fromPost('job_description_id_subordinate' . $jobDescriptionListingSubordinate->uuid, ''), FILTER_SANITIZE_STRING);
649 geraldo 454
                        if ($job_description_subordinate) {
66 efrain 455
                            $jobDescriptionSubordinate = new JobDescriptionSubordinate();
456
                            $jobDescriptionSubordinate->job_description_id_top_level = $jobDescription->id;
457
                            $jobDescriptionSubordinate->job_description_id_low_level = $jobDescriptionListingSubordinate->id;
458
                            $jobDescriptionSubordinateMapper->insert($jobDescriptionSubordinate);
459
                        }
460
                    }
649 geraldo 461
 
462
 
66 efrain 463
                    $this->logger->info('Se actualizo el cargo ' . $jobDescription->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
649 geraldo 464
 
66 efrain 465
                    $data = [
466
                        'success' => true,
467
                        'data' => 'LABEL_RECORD_UPDATED'
468
                    ];
469
                } else {
470
                    $data = [
649 geraldo 471
                        'success' => false,
472
                        'data' => $jobDescriptionMapper->getError()
66 efrain 473
                    ];
474
                }
649 geraldo 475
 
66 efrain 476
                return new JsonModel($data);
477
            } else {
478
                $messages = [];
479
                $form_messages = (array) $form->getMessages();
649 geraldo 480
                foreach ($form_messages as $fieldname => $field_messages) {
66 efrain 481
                    $messages[$fieldname] = array_values($field_messages);
482
                }
649 geraldo 483
 
66 efrain 484
                return new JsonModel([
649 geraldo 485
                    'success' => false,
486
                    'data' => $messages
66 efrain 487
                ]);
488
            }
489
        } else if ($request->isGet()) {
490
 
491
            $hydrator = new ObjectPropertyHydrator();
649 geraldo 492
 
66 efrain 493
            $data = $hydrator->extract($jobDescription);
649 geraldo 494
 
495
            if (!empty($data['job_description_id_boss'])) {
496
 
66 efrain 497
                $jobDescriptionBoss = $jobDescriptionMapper->fetchOne($data['job_description_id_boss']);
649 geraldo 498
                if ($jobDescriptionBoss) {
66 efrain 499
                    $data['job_description_id_boss'] = $jobDescriptionBoss->uuid;
500
                } else {
501
                    $data['job_description_id_boss'] = '';
502
                }
503
            } else {
504
                $data['job_description_id_boss'] = '';
505
            }
506
 
649 geraldo 507
 
66 efrain 508
            $data['competency_types'] = [];
649 geraldo 509
 
66 efrain 510
            $competencyTypeMapper = CompetencyTypeMapper::getInstance($this->adapter);
649 geraldo 511
 
857 geraldo 512
            $records = $currentCompany ?
513
                    $competencyTypeMapper->fetchAllByCompanyId($currentCompany->id) :
514
                    $competencyTypeMapper->fetchAllActivesByDefault();
515
 
66 efrain 516
            $competencyTypesUUID = [];
649 geraldo 517
            foreach ($records as $record) {
66 efrain 518
                array_push($data['competency_types'], [
519
                    'competency_type_id' => $record->uuid,
520
                    'name' => $record->name,
521
                ]);
649 geraldo 522
 
66 efrain 523
                $competencyTypesUUID[$record->id] = $record->uuid;
524
            }
649 geraldo 525
 
66 efrain 526
            $data['competencies'] = [];
649 geraldo 527
 
528
 
66 efrain 529
            $jobDescriptionCompetencyMapper = JobDescriptionCompetencyMapper::getInstance($this->adapter);
649 geraldo 530
 
66 efrain 531
            $competencyMapper = CompetencyMapper::getInstance($this->adapter);
649 geraldo 532
 
857 geraldo 533
            $records = $currentCompany ?
534
                    $competencyMapper->fetchAllActiveByCompanyId($currentCompany->id) :
535
                    $competencyMapper->fetchAllByDefault();
649 geraldo 536
 
537
            foreach ($records as $record) {
538
                if (isset($competencyTypesUUID[$record->competency_type_id])) {
539
 
540
 
66 efrain 541
                    $level = 0;
542
                    $jobDescriptionCompetency = $jobDescriptionCompetencyMapper->fetchOneByJobDescriptionIdAndCompetencyId($jobDescription->id, $record->id);
649 geraldo 543
                    if ($jobDescriptionCompetency) {
66 efrain 544
                        $level = $jobDescriptionCompetency->level;
545
                    }
649 geraldo 546
 
547
 
66 efrain 548
                    array_push($data['competencies'], [
549
                        'competency_type_id' => $competencyTypesUUID[$record->competency_type_id],
550
                        'competency_id' => $record->uuid,
551
                        'name' => $record->name,
552
                        'level' => $level
553
                    ]);
554
                }
555
            }
649 geraldo 556
 
66 efrain 557
            $data['jobs_description'] = [];
649 geraldo 558
 
66 efrain 559
            $jobsDescriptionUUID = [];
560
            $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
649 geraldo 561
 
857 geraldo 562
            $records = $currentCompany ?
563
                    $jobDescriptionMapper->fetchAllActiveByCompanyId($currentCompany->id) :
564
                    $jobDescriptionMapper->fetchAllByDefault();
565
 
649 geraldo 566
            foreach ($records as $record) {
567
                if ($record->id == $jobDescription->id) {
66 efrain 568
                    continue;
569
                }
649 geraldo 570
 
571
                $jobsDescriptionUUID[$record->id] = $record->uuid;
572
 
573
 
66 efrain 574
                array_push($data['jobs_description'], [
575
                    'job_description_id' => $record->uuid,
576
                    'name' => $record->name
577
                ]);
578
            }
649 geraldo 579
 
66 efrain 580
            $data['subordinates'] = [];
581
            $jobDescriptionSubordinateMapper = JobDescriptionSubordinateMapper::getInstance($this->adapter);
582
            $records = $jobDescriptionSubordinateMapper->fetchAllByJobDescriptionIdTopLevel($jobDescription->id);
583
 
649 geraldo 584
 
585
            foreach ($records as $record) {
586
 
587
                if (isset($jobsDescriptionUUID[$record->job_description_id_low_level])) {
588
 
589
 
66 efrain 590
                    array_push($data['subordinates'], $jobsDescriptionUUID[$record->job_description_id_low_level]);
591
                }
592
            }
593
 
649 geraldo 594
 
595
 
66 efrain 596
            $response = [
597
                'success' => true,
598
                'data' => $data
599
            ];
649 geraldo 600
 
66 efrain 601
            return new JsonModel($response);
602
        } else {
603
            $data = [
604
                'success' => false,
605
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
606
            ];
649 geraldo 607
 
66 efrain 608
            return new JsonModel($data);
609
        }
649 geraldo 610
 
66 efrain 611
        return new JsonModel($data);
612
    }
649 geraldo 613
 
614
    public function deleteAction() {
66 efrain 615
        $currentUserPlugin = $this->plugin('currentUserPlugin');
616
        $currentUser = $currentUserPlugin->getUser();
617
        $currentCompany = $currentUserPlugin->getCompany();
649 geraldo 618
 
66 efrain 619
        $request = $this->getRequest();
620
        $uuid = $this->params()->fromRoute('id');
649 geraldo 621
 
622
        if (!$uuid) {
66 efrain 623
            $data = [
649 geraldo 624
                'success' => false,
625
                'data' => 'ERROR_INVALID_PARAMETER'
66 efrain 626
            ];
649 geraldo 627
 
66 efrain 628
            return new JsonModel($data);
629
        }
649 geraldo 630
 
631
 
66 efrain 632
        $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
633
        $jobDescription = $jobDescriptionMapper->fetchOneByUuid($uuid);
649 geraldo 634
        if (!$jobDescription) {
66 efrain 635
            $data = [
649 geraldo 636
                'success' => false,
637
                'data' => 'ERROR_RECORD_NOT_FOUND'
66 efrain 638
            ];
649 geraldo 639
 
66 efrain 640
            return new JsonModel($data);
641
        }
649 geraldo 642
 
851 geraldo 643
        if ($currentCompany && $jobDescription->company_id != $currentCompany->id) {
66 efrain 644
            $data = [
649 geraldo 645
                'success' => false,
646
                'data' => 'ERROR_UNAUTHORIZED'
66 efrain 647
            ];
649 geraldo 648
 
66 efrain 649
            return new JsonModel($data);
650
        }
651
 
649 geraldo 652
 
653
        if ($request->isPost()) {
66 efrain 654
            $result = $jobDescriptionMapper->delete($jobDescription);
649 geraldo 655
            if ($result) {
66 efrain 656
                $this->logger->info('Se borro el cargo de trabajo ' . $jobDescription->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
649 geraldo 657
 
66 efrain 658
                $data = [
659
                    'success' => true,
660
                    'data' => 'LABEL_RECORD_DELETED'
661
                ];
662
            } else {
663
 
664
                $data = [
649 geraldo 665
                    'success' => false,
666
                    'data' => $jobDescriptionMapper->getError()
66 efrain 667
                ];
668
 
669
                return new JsonModel($data);
670
            }
671
        } else {
672
            $data = [
673
                'success' => false,
674
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
675
            ];
649 geraldo 676
 
66 efrain 677
            return new JsonModel($data);
678
        }
649 geraldo 679
 
66 efrain 680
        return new JsonModel($data);
681
    }
561 geraldo 682
 
854 geraldo 683
    public function importAction() {
850 geraldo 684
 
852 geraldo 685
        $currentUserPlugin = $this->plugin('currentUserPlugin');
686
        $currentUser = $currentUserPlugin->getUser();
687
        $currentCompany = $currentUserPlugin->getCompany();
854 geraldo 688
 
689
        if (!$currentCompany) {
852 geraldo 690
            $data = [
691
                'success' => false,
692
                'data' => 'ERROR_UNAUTHORIZED'
693
            ];
854 geraldo 694
 
852 geraldo 695
            return new JsonModel($data);
696
        }
854 geraldo 697
 
852 geraldo 698
        $request = $this->getRequest();
854 geraldo 699
 
700
        if ($request->isPost()) {
701
 
852 geraldo 702
            $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
703
            $jobDescriptionsDefault = $jobDescriptionMapper->fetchAllByDefault();
854 geraldo 704
 
852 geraldo 705
            $new_records = 0;
854 geraldo 706
            foreach ($jobDescriptionsDefault as $jobDescriptionDefault) {
707
                if ($jobDescriptionDefault->status == JobDescription::STATUS_INACTIVE) {
852 geraldo 708
                    continue;
709
                }
854 geraldo 710
 
852 geraldo 711
                $jobDescription = $jobDescriptionMapper->fetchOneByCompanyId($currentCompany->id, $jobDescriptionDefault->id);
854 geraldo 712
                if (!$jobDescription) {
713
 
852 geraldo 714
                    $jobDescription = new JobDescription();
715
                    $jobDescription->company_id = $currentCompany->id;
716
                    $jobDescription->job_description_id_default = $jobDescriptionDefault->id;
717
                    $jobDescription->name = $jobDescriptionDefault->name;
718
                    $jobDescription->functions = $jobDescriptionDefault->functions;
719
                    $jobDescription->objectives = $jobDescriptionDefault->objectives;
720
                    $jobDescription->status = JobDescription::STATUS_ACTIVE;
854 geraldo 721
 
722
 
723
                    if ($jobDescriptionMapper->insert($jobDescription)) {
852 geraldo 724
                        $new_records++;
725
                    } else {
726
                        $data = [
727
                            'success' => false,
728
                            'data' => 'ERROR_CANT_ADD_JOB_DESCRIPTION'
729
                        ];
854 geraldo 730
 
852 geraldo 731
                        return new JsonModel($data);
732
                    }
733
                }
734
            }
854 geraldo 735
 
736
            if ($new_records) {
737
 
738
                if (1 == $new_records) {
852 geraldo 739
                    $data = [
740
                        'success' => true,
741
                        'data' => 'LABEL_1_JOB_DESCRIPTION_IMPORTED'
742
                    ];
854 geraldo 743
 
852 geraldo 744
                    return new JsonModel($data);
745
                } else {
746
                    $data = [
747
                        'success' => true,
854 geraldo 748
                        'data' => $new_records . ' LABEL_MULTI_JOB_DESCRIPTION_IMPORTED'
852 geraldo 749
                    ];
854 geraldo 750
 
852 geraldo 751
                    return new JsonModel($data);
752
                }
753
            } else {
754
                $data = [
755
                    'success' => true,
756
                    'data' => 'LABEL_NO_JOB_DESCRIPTION_IMPORTED'
757
                ];
854 geraldo 758
 
852 geraldo 759
                return new JsonModel($data);
760
            }
761
        } else {
762
            $data = [
763
                'success' => false,
764
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
765
            ];
854 geraldo 766
 
852 geraldo 767
            return new JsonModel($data);
768
        }
854 geraldo 769
 
852 geraldo 770
        return new JsonModel($data);
850 geraldo 771
    }
772
 
649 geraldo 773
    public function reportAction() {
561 geraldo 774
        $currentUserPlugin = $this->plugin('currentUserPlugin');
775
        $currentUser = $currentUserPlugin->getUser();
776
        $currentCompany = $currentUserPlugin->getCompany();
649 geraldo 777
 
561 geraldo 778
        $request = $this->getRequest();
779
        $uuid = $this->params()->fromRoute('id');
780
 
649 geraldo 781
 
782
        if (!$uuid) {
561 geraldo 783
            $data = [
649 geraldo 784
                'success' => false,
785
                'data' => 'ERROR_INVALID_PARAMETER'
561 geraldo 786
            ];
649 geraldo 787
 
561 geraldo 788
            return new JsonModel($data);
789
        }
790
 
791
        $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
792
        $jobDescription = $jobDescriptionMapper->fetchOneByUuid($uuid);
649 geraldo 793
        if (!$jobDescription) {
561 geraldo 794
            $data = [
649 geraldo 795
                'success' => false,
796
                'data' => 'ERROR_RECORD_NOT_FOUND'
561 geraldo 797
            ];
649 geraldo 798
 
561 geraldo 799
            return new JsonModel($data);
800
        }
649 geraldo 801
 
851 geraldo 802
        if ($currentCompany && $jobDescription->company_id != $currentCompany->id) {
561 geraldo 803
            $data = [
649 geraldo 804
                'success' => false,
805
                'data' => 'ERROR_UNAUTHORIZED'
561 geraldo 806
            ];
649 geraldo 807
 
561 geraldo 808
            return new JsonModel($data);
809
        }
810
 
649 geraldo 811
 
561 geraldo 812
        if ($request->isGet()) {
813
 
842 geraldo 814
            return $this->renderPdf($currentCompany, $jobDescription);
561 geraldo 815
        } else {
816
            $data = [
817
                'success' => false,
818
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
819
            ];
649 geraldo 820
 
561 geraldo 821
            return new JsonModel($data);
822
        }
649 geraldo 823
 
561 geraldo 824
        return new JsonModel($data);
825
    }
842 geraldo 826
 
788 geraldo 827
    /**
828
     * Render PDF
829
     * @param type $currentCompany
830
     * @param type $jobDescription
831
     * @return type
832
     */
789 geraldo 833
    public function renderPDF($currentCompany, $jobDescription) {
561 geraldo 834
 
835
        //Generate New PDF
789 geraldo 836
        $pdf = new JobPDF();
842 geraldo 837
 
854 geraldo 838
        $pdf->header = '';
839
        $pdf->footer = '';
849 geraldo 840
 
842 geraldo 841
 
854 geraldo 842
        if ($currentCompany) {
843
            //get company Data
844
            $companyMapper = CompanyMapper::getInstance($this->adapter);
845
            $company = $companyMapper->fetchOne($currentCompany->id);
561 geraldo 846
 
854 geraldo 847
            $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $company->uuid;
842 geraldo 848
 
854 geraldo 849
            $pdf->header = $company->header ? $target_path . DIRECTORY_SEPARATOR . $company->header : '';
850
            $pdf->footer = $company->footer ? $target_path . DIRECTORY_SEPARATOR . $company->footer : '';
847 geraldo 851
        }
848 geraldo 852
 
727 geraldo 853
        $pdf->SetMargins(20, 0, 20);
714 geraldo 854
 
561 geraldo 855
        $pdf->AliasNbPages();
856
        $pdf->AddPage();
564 geraldo 857
 
697 geraldo 858
        // Add Title
859
        $pdf->customHeader();
654 geraldo 860
 
649 geraldo 861
        // Job Description Name
654 geraldo 862
 
649 geraldo 863
        $job_descrition[] = array(
654 geraldo 864
            'title' => 'Categoría Laboral:',
709 geraldo 865
            'content' => ' ' . $jobDescription->name
649 geraldo 866
        );
654 geraldo 867
 
764 geraldo 868
        $pdf->borderTable('Nombre del cargo de trabajo:', $job_descrition);
649 geraldo 869
 
870
 
654 geraldo 871
        //Hierarchical Relationship
872
 
650 geraldo 873
        $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
714 geraldo 874
 
875
        $jobDescriptionSubordinateMapper = JobDescriptionSubordinateMapper::getInstance($this->adapter);
724 geraldo 876
        $jobDescriptionSubordinate = $jobDescriptionSubordinateMapper->fetchAllByJobDescriptionIdTopLevel($jobDescription->id);
714 geraldo 877
 
878
        $subordinate = '';
745 geraldo 879
 
880
        if ($jobDescriptionSubordinate) {
881
 
882
            foreach ($jobDescriptionSubordinate as $rs) {
725 geraldo 883
                $jobSubordinate = $jobDescriptionMapper->fetchOne($rs->job_description_id_low_level);
745 geraldo 884
                if ($jobSubordinate) {
885
                    $subordinate .= $jobSubordinate->name . ' ';
886
                }
717 geraldo 887
            }
888
        }
714 geraldo 889
 
649 geraldo 890
        $jobDescriptionBoss = $jobDescriptionMapper->fetchOne($jobDescription->job_description_id_boss);
891
 
654 geraldo 892
        $relationship = [
614 geraldo 893
            array(
714 geraldo 894
                'title' => 'Depende de: ',
726 geraldo 895
                'content' => $subordinate ? ' ' . $subordinate : ' No aplica'
649 geraldo 896
            ),
897
            array(
898
                'title' => 'Supervisa a: ',
709 geraldo 899
                'content' => $jobDescriptionBoss ? ' ' . $jobDescriptionBoss->name : ' No aplica'
649 geraldo 900
            )
654 geraldo 901
        ];
579 geraldo 902
 
701 geraldo 903
        $pdf->borderTable('Relación jerárquica:', $relationship);
628 geraldo 904
 
654 geraldo 905
        // Objetives
628 geraldo 906
 
654 geraldo 907
        $objetives[] = array('content' => strip_tags($jobDescription->objectives));
708 geraldo 908
        $pdf->borderTable('Objetivos:', $objetives);
653 geraldo 909
 
654 geraldo 910
        // Functions
628 geraldo 911
 
654 geraldo 912
        $functions[] = array('content' => strip_tags($jobDescription->functions));
708 geraldo 913
        $pdf->borderTable('Funciones principales:', $functions);
628 geraldo 914
 
749 geraldo 915
        // add section signature
709 geraldo 916
        $pdf->sectionSignature();
917
 
654 geraldo 918
        //Competencies
628 geraldo 919
 
658 geraldo 920
        $jobDescriptionCompetencyMapper = JobDescriptionCompetencyMapper::getInstance($this->adapter);
667 geraldo 921
        $jobDescriptionCompetency = $jobDescriptionCompetencyMapper->fetchByJobDescriptionId($jobDescription->id);
649 geraldo 922
 
672 geraldo 923
        $competencyMapper = CompetencyMapper::getInstance($this->adapter);
842 geraldo 924
 
751 geraldo 925
        $countCompetencies = count($jobDescriptionCompetency);
672 geraldo 926
 
751 geraldo 927
        if ($countCompetencies != 0) {
842 geraldo 928
 
748 geraldo 929
            // add new page
842 geraldo 930
 
748 geraldo 931
            $pdf->AddPage();
679 geraldo 932
 
745 geraldo 933
            $competencies_header[] = array('content' => 'De acuerdo a la siguiente escala, se deberá asignar un valor a cada conducta deseable correspondiente a cada una de las competencias requeridas para el cargo. La valoración refiere a las conductas deseables requeridas en cada cargo, y no refiere a la persona que lo ocupa');
679 geraldo 934
 
745 geraldo 935
            $pdf->singleTable('Competencias requeridas para el cargo:', $competencies_header);
709 geraldo 936
 
745 geraldo 937
 
938
            // Add scale section
939
            $pdf->sectionScale();
940
 
941
            $i = 0;
942
            foreach ($jobDescriptionCompetency as $record) {
943
 
944
                $i = $i + 1;
945
 
946
                $competency = $competencyMapper->fetchOne($record->competency_id);
753 geraldo 947
                $pdf->competencyTable($i, $competency, $record->level);
745 geraldo 948
 
752 geraldo 949
                if ($i % 3 == 0 && $i < $countCompetencies) {
745 geraldo 950
                    $pdf->AddPage();
951
                }
709 geraldo 952
            }
669 geraldo 953
        }
658 geraldo 954
 
955
 
561 geraldo 956
        return $pdf->Output();
957
    }
649 geraldo 958
 
66 efrain 959
}