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;
15
use LeadersLinked\Mapper\RecruitmentSelectionCandidateMapper;
16
use LeadersLinked\Model\RecruitmentSelectionCandidate;
17
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
18
use LeadersLinked\Model\RecruitmentSelectionVacancy;
19
use LeadersLinked\Mapper\BehaviorMapper;
1473 eleazar 20
use LeadersLinked\Mapper\UserMapper;
1468 eleazar 21
use LeadersLinked\Mapper\CompanyMapper;
22
use LeadersLinked\Model\Company;
23
 
1470 eleazar 24
class RecruitmentSelectionCandidateController extends AbstractActionController{
25
 
26
    /**
1468 eleazar 27
     *
28
     * @var AdapterInterface
29
     */
30
    private $adapter;
31
 
32
    /**
33
     *
34
     * @var AbstractAdapter
35
     */
36
    private $cache;
37
 
38
    /**
39
     *
40
     * @var  LoggerInterface
41
     */
42
    private $logger;
43
 
44
    /**
45
     *
46
     * @var array
47
     */
48
    private $config;
49
 
50
    /**
51
     *
52
     * @param AdapterInterface $adapter
53
     * @param AbstractAdapter $cache
54
     * @param LoggerInterface $logger
55
     * @param array $config
56
     */
57
    public function __construct($adapter, $cache, $logger, $config) {
58
        $this->adapter = $adapter;
59
        $this->cache = $cache;
60
        $this->logger = $logger;
61
        $this->config = $config;
62
    }
63
 
64
    public function indexAction() {
65
        $currentUserPlugin = $this->plugin('currentUserPlugin');
66
        $currentUser = $currentUserPlugin->getUser();
67
        $currentCompany = $currentUserPlugin->getCompany();
68
 
69
        $request = $this->getRequest();
70
 
71
        if ($request->isGet()) {
72
 
73
            $headers = $request->getHeaders();
74
 
75
            $isJson = false;
76
            if ($headers->has('Accept')) {
77
                $accept = $headers->get('Accept');
78
 
79
                $prioritized = $accept->getPrioritized();
80
 
81
                foreach ($prioritized as $key => $value) {
82
                    $raw = trim($value->getRaw());
83
 
84
                    if (!$isJson) {
85
                        $isJson = strpos($raw, 'json');
86
                    }
87
                }
88
            }
89
 
90
            if ($isJson) {
1477 efrain 91
                //$form_uuid = filter_var($this->params()->fromQuery('form_uuid'), FILTER_SANITIZE_STRING);
1468 eleazar 92
 
1477 efrain 93
                $vacancy_uuid = $this->params()->fromRoute('vacancy_id');
94
 
1468 eleazar 95
                $data = [
96
                    'items' => [],
97
                    'total' => 0,
98
                ];
99
 
100
 
1477 efrain 101
                if (!$vacancy_uuid) {
1468 eleazar 102
                    return new JsonModel([
103
                        'success' => true,
104
                        'data' => $data
105
                    ]);
106
                }
107
 
108
 
1477 efrain 109
                $vacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
110
                $vacancy = $vacancyMapper->fetchOneByUuid($vacancy_uuid);
111
                if (! $vacancy) {
1468 eleazar 112
                    return new JsonModel([
113
                        'success' => true,
114
                        'data' => 'ERROR_FORM_NOT_FOUND'
115
                    ]);
116
                }
117
 
1477 efrain 118
                if ( $vacancy->company_id != $currentCompany->id) {
1468 eleazar 119
                    return new JsonModel([
120
                        'success' => true,
121
                        'data' => 'ERROR_UNAUTHORIZED'
122
                    ]);
123
                }
124
 
125
 
126
                $search = $this->params()->fromQuery('search', []);
127
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
128
 
129
                $page = intval($this->params()->fromQuery('start', 1), 10);
130
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
131
                $order = $this->params()->fromQuery('order', []);
132
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
133
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
134
 
135
                $fields = ['uuid', 'first_name', 'last_name', 'email'];
136
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
137
 
138
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
139
                    $order_direction = 'ASC';
140
                }
141
 
142
                $formUsersMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
143
 
144
 
145
 
146
 
147
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
148
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/candidates/add');
149
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/candidates/delete');
150
 
151
                $queryMapper = QueryMapper::getInstance($this->adapter);
152
                $sql = $queryMapper->getSql();
153
                $select = $sql->select();
154
                $select->columns(['id', 'uuid', 'first_name', 'last_name', 'email']);
155
                $select->from(['tb1' => UserMapper::_TABLE]);
156
                $select->join(['tb2' => CompanyUserMapper::_TABLE], 'tb1.id = tb2.user_id ', []);
157
                $select->where->equalTo('tb2.company_id', $form->company_id);
158
 
159
                if ($search) {
160
                    $select->where->nest()
161
                            ->like('first_name', '%' . $search . '%')
162
                            ->or->like('last_name', '%' . $search . '%')
163
                            ->or->like('email', '%' . $search . '%')
164
                            ->unnest();
165
                }
166
 
167
 
168
                $select->order($order_field . ' ' . $order_direction);
169
 
170
                $hydrator = new ArraySerializableHydrator();
171
                $resultset = new HydratingResultSet($hydrator);
172
 
173
                $adapter = new DbSelect($select, $sql, $resultset);
174
                $paginator = new Paginator($adapter);
175
                $paginator->setItemCountPerPage($records_x_page);
176
                $paginator->setCurrentPageNumber($page);
177
 
178
 
179
                $items = [];
180
                $records = $paginator->getCurrentItems();
181
                foreach ($records as $record) {
182
                    $params = [
183
                        'form_id' => $form->uuid,
184
                        'user_id' => $record['uuid'],
185
                    ];
186
 
187
                    $link_add = '';
188
                    $link_delete = '';
189
                    $formUser = $formUsersMapper->fetchAllByCompanyIdAndFormIdAndUserId($form->company_id, $form->id, $record['id']);
190
 
191
                    if ($formUser) {
1474 eleazar 192
                        $link_delete = $this->url()->fromRoute('recruitment-and-selection/candidates/delete', $params);
1468 eleazar 193
                    } else {
1474 eleazar 194
                        $link_add = $this->url()->fromRoute('recruitment-and-selection/candidates/add', $params);
1468 eleazar 195
                    }
196
 
197
                    $item = [
198
                        'uuid' => $record['uuid'],
199
                        'first_name' => $record['first_name'],
200
                        'last_name' => $record['last_name'],
201
                        'email' => $record['email'],
202
                        'actions' => [
203
                            'link_add' => $allowAdd ? $link_add : '',
204
                            'link_delete' => $allowDelete ? $link_delete : '',
205
                        ]
206
                    ];
207
 
208
 
209
                    array_push($items, $item);
210
                }
211
 
212
                $data['items'] = $items;
213
                $data['total'] = $paginator->getTotalItemCount();
214
 
215
 
216
                return new JsonModel([
217
                    'success' => true,
218
                    'data' => $data
219
                ]);
220
            } else {
221
 
222
 
223
                $form = new RecruitmentSelectionCandidateFormForm($this->adapter, $currentCompany->id);
224
 
225
 
226
 
227
                $this->layout()->setTemplate('layout/layout-backend');
228
                $viewModel = new ViewModel();
1475 eleazar 229
                $viewModel->setTemplate('leaders-linked/recruitment-and-selection-candidates/index.phtml');
1468 eleazar 230
                $viewModel->setVariables([
231
                    'form' => $form,
232
                ]);
233
 
234
                return $viewModel;
235
            }
236
        } else {
237
            return new JsonModel([
238
                'success' => false,
239
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
240
            ]);
241
            ;
242
        }
243
    }
244
 
245
}