Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1468 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;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
1471 eleazar 13
use LeadersLinked\Form\RecruitmentSelectionCandidateFormForm;
1468 eleazar 14
use LeadersLinked\Library\Functions;
1479 eleazar 15
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
1468 eleazar 16
use LeadersLinked\Mapper\RecruitmentSelectionCandidateMapper;
17
use LeadersLinked\Model\RecruitmentSelectionCandidate;
18
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
19
use LeadersLinked\Model\RecruitmentSelectionVacancy;
20
use LeadersLinked\Mapper\BehaviorMapper;
1473 eleazar 21
use LeadersLinked\Mapper\UserMapper;
1468 eleazar 22
use LeadersLinked\Mapper\CompanyMapper;
23
use LeadersLinked\Model\Company;
24
 
1470 eleazar 25
class RecruitmentSelectionCandidateController extends AbstractActionController{
26
 
27
    /**
1468 eleazar 28
     *
29
     * @var AdapterInterface
30
     */
31
    private $adapter;
32
 
33
    /**
34
     *
35
     * @var AbstractAdapter
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
     * @param AdapterInterface $adapter
54
     * @param AbstractAdapter $cache
55
     * @param LoggerInterface $logger
56
     * @param array $config
57
     */
58
    public function __construct($adapter, $cache, $logger, $config) {
59
        $this->adapter = $adapter;
60
        $this->cache = $cache;
61
        $this->logger = $logger;
62
        $this->config = $config;
63
    }
64
 
65
    public function indexAction() {
66
        $currentUserPlugin = $this->plugin('currentUserPlugin');
67
        $currentUser = $currentUserPlugin->getUser();
68
        $currentCompany = $currentUserPlugin->getCompany();
69
 
70
        $request = $this->getRequest();
71
 
72
        if ($request->isGet()) {
73
 
74
            $headers = $request->getHeaders();
75
 
76
            $isJson = false;
77
            if ($headers->has('Accept')) {
78
                $accept = $headers->get('Accept');
79
 
80
                $prioritized = $accept->getPrioritized();
81
 
82
                foreach ($prioritized as $key => $value) {
83
                    $raw = trim($value->getRaw());
84
 
85
                    if (!$isJson) {
86
                        $isJson = strpos($raw, 'json');
87
                    }
88
                }
89
            }
90
 
91
            if ($isJson) {
1477 efrain 92
                //$form_uuid = filter_var($this->params()->fromQuery('form_uuid'), FILTER_SANITIZE_STRING);
1468 eleazar 93
 
1502 eleazar 94
                $vacancy_uuid = $this->params()->fromRoute('vacancy_uuid');
1501 eleazar 95
 
1468 eleazar 96
                $data = [
97
                    'items' => [],
98
                    'total' => 0,
99
                ];
100
 
101
 
1477 efrain 102
                if (!$vacancy_uuid) {
1468 eleazar 103
                    return new JsonModel([
104
                        'success' => true,
105
                        'data' => $data
106
                    ]);
107
                }
108
 
109
 
1477 efrain 110
                $vacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
111
                $vacancy = $vacancyMapper->fetchOneByUuid($vacancy_uuid);
112
                if (! $vacancy) {
1468 eleazar 113
                    return new JsonModel([
114
                        'success' => true,
115
                        'data' => 'ERROR_FORM_NOT_FOUND'
116
                    ]);
117
                }
118
 
1477 efrain 119
                if ( $vacancy->company_id != $currentCompany->id) {
1468 eleazar 120
                    return new JsonModel([
121
                        'success' => true,
122
                        'data' => 'ERROR_UNAUTHORIZED'
123
                    ]);
124
                }
125
 
126
 
127
                $search = $this->params()->fromQuery('search', []);
128
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
129
 
130
                $page = intval($this->params()->fromQuery('start', 1), 10);
131
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
132
                $order = $this->params()->fromQuery('order', []);
133
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
134
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
135
 
136
                $fields = ['uuid', 'first_name', 'last_name', 'email'];
137
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
138
 
139
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
140
                    $order_direction = 'ASC';
141
                }
142
 
143
                $formUsersMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
144
 
145
 
146
 
147
 
148
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
149
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/candidates/add');
150
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/candidates/delete');
151
 
152
                $select->order($order_field . ' ' . $order_direction);
153
 
154
                $hydrator = new ArraySerializableHydrator();
155
                $resultset = new HydratingResultSet($hydrator);
156
 
157
                $adapter = new DbSelect($select, $sql, $resultset);
158
                $paginator = new Paginator($adapter);
159
                $paginator->setItemCountPerPage($records_x_page);
160
                $paginator->setCurrentPageNumber($page);
161
 
162
 
163
                $items = [];
164
                $records = $paginator->getCurrentItems();
165
                foreach ($records as $record) {
166
                    $params = [
1499 eleazar 167
                        'form_id' => $vacancy->uuid,
1468 eleazar 168
                        'user_id' => $record['uuid'],
169
                    ];
170
 
171
                    $link_add = '';
172
                    $link_delete = '';
1499 eleazar 173
                    $formUser = $formUsersMapper->fetchAllByCompanyIdAndFormIdAndUserId($vacancy->company_id, $vacancy->id, $record['id']);
1468 eleazar 174
 
175
                    if ($formUser) {
1474 eleazar 176
                        $link_delete = $this->url()->fromRoute('recruitment-and-selection/candidates/delete', $params);
1468 eleazar 177
                    } else {
1474 eleazar 178
                        $link_add = $this->url()->fromRoute('recruitment-and-selection/candidates/add', $params);
1468 eleazar 179
                    }
180
 
181
                    $item = [
182
                        'uuid' => $record['uuid'],
183
                        'first_name' => $record['first_name'],
184
                        'last_name' => $record['last_name'],
185
                        'email' => $record['email'],
186
                        'actions' => [
187
                            'link_add' => $allowAdd ? $link_add : '',
188
                            'link_delete' => $allowDelete ? $link_delete : '',
189
                        ]
190
                    ];
191
 
192
 
193
                    array_push($items, $item);
194
                }
195
 
196
                $data['items'] = $items;
197
                $data['total'] = $paginator->getTotalItemCount();
198
 
199
 
200
                return new JsonModel([
201
                    'success' => true,
202
                    'data' => $data
203
                ]);
204
            } else {
205
                $form = new RecruitmentSelectionCandidateFormForm($this->adapter, $currentCompany->id);
206
 
207
                $this->layout()->setTemplate('layout/layout-backend');
208
                $viewModel = new ViewModel();
1475 eleazar 209
                $viewModel->setTemplate('leaders-linked/recruitment-and-selection-candidates/index.phtml');
1468 eleazar 210
                $viewModel->setVariables([
211
                    'form' => $form,
212
                ]);
213
 
214
                return $viewModel;
215
            }
216
        } else {
217
            return new JsonModel([
218
                'success' => false,
219
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
220
            ]);
221
            ;
222
        }
223
    }
224
 
1485 eleazar 225
    public function addAction()
226
    {
227
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
228
        $currentCompany     = $currentUserPlugin->getCompany();
229
        $currentUser        = $currentUserPlugin->getUser();
230
 
231
        $request    = $this->getRequest();
232
 
1515 eleazar 233
        $vacancy_uuid = $this->params()->fromRoute('vacancy_uuid');
234
 
1485 eleazar 235
        if($request->isPost()) {
1513 eleazar 236
            $form = new  RecruitmentSelectionCandidateFormForm($this->adapter, $currentCompany->id);
1516 eleazar 237
            $dataPost = array_merge(
238
                $request->getPost()->toArray(),
239
                $request->getFiles()->toArray(),
240
                ['form_uuid' => $vacancy_uuid],
241
            );
1485 eleazar 242
 
243
            $form->setData($dataPost);
244
 
245
            if($form->isValid()) {
246
                $dataPost = (array) $form->getData();
247
 
248
                $hydrator = new ObjectPropertyHydrator();
249
                $candidate = new RecruitmentSelectionCandidate();
250
                $hydrator->hydrate($dataPost, $candidate);
251
 
1537 eleazar 252
                $file = $candidate->file;
1538 eleazar 253
                // $candidate->file = null;
254
 
1485 eleazar 255
                $candidate->company_id = $currentCompany->id;
256
                $candidate->image = null;
1520 eleazar 257
 
258
                $vacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
259
                $vacancy = $vacancyMapper->fetchOneByUuid($vacancy_uuid);
260
 
1521 eleazar 261
                $candidate->selection_id = $vacancy->id;
1520 eleazar 262
                $candidate->status = 'a';
1485 eleazar 263
 
1494 eleazar 264
                $candidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
1518 eleazar 265
 
1534 eleazar 266
                if($candidateMapper->insert($candidate)) {
1533 eleazar 267
                    // $candidate = $candidateMapper->fetchOne($candidate->id);
1530 eleazar 268
 
269
                    return new JsonModel([
270
                        'success' => false,
271
                        'data' => [
1532 eleazar 272
                            (array)$candidate,
1530 eleazar 273
                        ]
274
                    ]);
1485 eleazar 275
 
276
                    //leaderslinked.fullpath.recruitment_selection/uuid vacante/uuid candidato
277
 
1530 eleazar 278
                    // $target_path = $this->config['leaderslinked.fullpath.recruitment_selection'] .  $candidate->uuid;
279
                    // if(!file_exists($target_path)) {
280
                    //     mkdir($target_path, 0755, true);
281
                    // }
1518 eleazar 282
 
1530 eleazar 283
                    // $files = $this->getRequest()->getFiles()->toArray();
284
                    // if(isset($files['file']) && empty($files['file']['error'])) {
285
                    //     $tmp_filename  = $files['file']['tmp_name'];
1485 eleazar 286
 
1530 eleazar 287
                    //     try {
288
                    //         $filename = 'candidate-' .uniqid() . '.png';
289
                    //         $crop_to_dimensions = true;
290
                    //         if(Image::uploadFile($tmp_filename, $target_path, $filename, $target_width, $target_height, $crop_to_dimensions)) {
291
                    //             $candidate->file = $filename;
292
                    //             $candidateMapper->update($candidate);
293
                    //         }
294
                    //     } catch(\Throwable $e) {
295
                    //         error_log($e->getTraceAsString());
296
                    //     }
297
                    // }
1518 eleazar 298
 
1485 eleazar 299
                    $this->logger->info('Se agrego el candidato ' . $candidate->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
300
 
301
                    $data = [
302
                        'success'   => true,
303
                        'data'   => 'LABEL_RECORD_ADDED'
304
                    ];
305
                } else {
306
                    $data = [
307
                        'success'   => false,
1494 eleazar 308
                        'data'      => $candidateMapper->getError()
1485 eleazar 309
                    ];
310
 
311
                }
312
 
313
                return new JsonModel($data);
314
 
315
            } else {
316
                $messages = [];
317
                $form_messages = (array) $form->getMessages();
318
                foreach($form_messages  as $fieldname => $field_messages)
319
                {
320
 
321
                    $messages[$fieldname] = array_values($field_messages);
322
                }
323
 
324
                return new JsonModel([
325
                    'success'   => false,
326
                    'data'   => $messages
327
                ]);
328
            }
329
 
330
        } else {
331
            $data = [
332
                'success' => false,
333
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
334
            ];
335
 
336
            return new JsonModel($data);
337
        }
338
 
339
        return new JsonModel($data);
340
    }
1468 eleazar 341
}