Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
1 www 1
<?php
1098 geraldo 2
 
1 www 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;
15
use LeadersLinked\Mapper\CompetencyMapper;
16
use LeadersLinked\Model\Competency;
17
use LeadersLinked\Form\CompetencyForm;
18
use LeadersLinked\Mapper\CompetencyTypeMapper;
1140 geraldo 19
use LeadersLinked\Mapper\BehaviorCompetencyMapper;
20
use LeadersLinked\Model\BehaviorCompetency;
28 efrain 21
use LeadersLinked\Model\CompetencyType;
1 www 22
 
1098 geraldo 23
class CompetencyController extends AbstractActionController {
1 www 24
 
25
    /**
26
     *
27
     * @var AdapterInterface
28
     */
29
    private $adapter;
1098 geraldo 30
 
1 www 31
    /**
32
     *
33
     * @var AbstractAdapter
34
     */
35
    private $cache;
1098 geraldo 36
 
1 www 37
    /**
38
     *
39
     * @var  LoggerInterface
40
     */
41
    private $logger;
42
 
43
    /**
44
     *
45
     * @var array
46
     */
47
    private $config;
1098 geraldo 48
 
1 www 49
    /**
50
     *
51
     * @param AdapterInterface $adapter
52
     * @param AbstractAdapter $cache
53
     * @param LoggerInterface $logger
54
     * @param array $config
55
     */
1098 geraldo 56
    public function __construct($adapter, $cache, $logger, $config) {
57
        $this->adapter = $adapter;
58
        $this->cache = $cache;
59
        $this->logger = $logger;
60
        $this->config = $config;
1 www 61
    }
1098 geraldo 62
 
63
    public function indexAction() {
28 efrain 64
        $currentUserPlugin = $this->plugin('currentUserPlugin');
65
        $currentUser = $currentUserPlugin->getUser();
66
        $currentCompany = $currentUserPlugin->getCompany();
1098 geraldo 67
 
1 www 68
        $request = $this->getRequest();
1098 geraldo 69
 
70
        $headers = $request->getHeaders();
71
 
1 www 72
        $request = $this->getRequest();
1098 geraldo 73
        if ($request->isGet()) {
74
 
75
 
76
            $headers = $request->getHeaders();
77
 
1 www 78
            $isJson = false;
1098 geraldo 79
            if ($headers->has('Accept')) {
1 www 80
                $accept = $headers->get('Accept');
1098 geraldo 81
 
1 www 82
                $prioritized = $accept->getPrioritized();
1098 geraldo 83
 
84
                foreach ($prioritized as $key => $value) {
1 www 85
                    $raw = trim($value->getRaw());
1098 geraldo 86
 
87
                    if (!$isJson) {
1 www 88
                        $isJson = strpos($raw, 'json');
89
                    }
90
                }
91
            }
1098 geraldo 92
 
93
            if ($isJson) {
1 www 94
                $search = $this->params()->fromQuery('search', []);
95
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
1098 geraldo 96
 
97
                $page = intval($this->params()->fromQuery('start', 1), 10);
98
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
99
                $order = $this->params()->fromQuery('order', []);
100
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
101
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
102
 
103
                $fields = ['type', 'name'];
1 www 104
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
1098 geraldo 105
 
106
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
1 www 107
                    $order_direction = 'ASC';
108
                }
1098 geraldo 109
 
1 www 110
                $competenceMapper = CompetencyMapper::getInstance($this->adapter);
1098 geraldo 111
 
112
 
113
 
114
                if ($currentCompany) {
28 efrain 115
                    $paginator = $competenceMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
116
                } else {
117
                    $paginator = $competenceMapper->fetchAllDataTable($search, $page, $records_x_page, $order_field, $order_direction);
118
                }
1 www 119
                $items = [];
120
                $records = $paginator->getCurrentItems();
1098 geraldo 121
                foreach ($records as $record) {
1 www 122
                    $item = [
123
                        'type' => $record['type'],
124
                        'name' => $record['name'],
125
                        'status' => $record['status'],
126
                        'actions' => [
1098 geraldo 127
                            'link_edit' => $this->url()->fromRoute('settings/competencies/edit', ['id' => $record['uuid']]),
128
                            'link_delete' => $this->url()->fromRoute('settings/competencies/delete', ['id' => $record['uuid']])
129
                        ]
1 www 130
                    ];
1098 geraldo 131
 
1 www 132
                    array_push($items, $item);
133
                }
1098 geraldo 134
 
1 www 135
                return new JsonModel([
136
                    'success' => true,
137
                    'data' => [
138
                        'items' => $items,
139
                        'total' => $paginator->getTotalItemCount(),
140
                    ]
141
                ]);
1098 geraldo 142
            } else {
143
                if ($currentCompany) {
66 efrain 144
                    $form = new CompetencyForm($this->adapter, $currentCompany->id);
145
                } else {
146
                    $form = new CompetencyForm($this->adapter);
147
                }
1098 geraldo 148
 
1 www 149
                $this->layout()->setTemplate('layout/layout-backend');
150
                $viewModel = new ViewModel();
151
                $viewModel->setTemplate('leaders-linked/competencies/index.phtml');
152
                $viewModel->setVariable('form', $form);
1098 geraldo 153
                return $viewModel;
154
            }
1 www 155
        } else {
156
            return new JsonModel([
157
                'success' => false,
158
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1098 geraldo 159
            ]);
160
            ;
1 www 161
        }
162
    }
1098 geraldo 163
 
164
    public function addAction() {
1 www 165
        $currentUserPlugin = $this->plugin('currentUserPlugin');
166
        $currentUser = $currentUserPlugin->getUser();
28 efrain 167
        $currentCompany = $currentUserPlugin->getCompany();
1098 geraldo 168
 
1 www 169
        $request = $this->getRequest();
1098 geraldo 170
 
171
 
172
        if ($request->isPost()) {
173
            if ($currentCompany) {
66 efrain 174
                $form = new CompetencyForm($this->adapter, $currentCompany->id);
175
            } else {
176
                $form = new CompetencyForm($this->adapter);
177
            }
1 www 178
            $dataPost = $request->getPost()->toArray();
1098 geraldo 179
 
1 www 180
            $form->setData($dataPost);
1098 geraldo 181
 
182
            if ($form->isValid()) {
1 www 183
                $dataPost = (array) $form->getData();
184
                $dataPost['status'] = $dataPost['status'] ? $dataPost['status'] : Competency::STATUS_INACTIVE;
1098 geraldo 185
 
1 www 186
                $competenceTypeMapper = CompetencyTypeMapper::getInstance($this->adapter);
187
                $competenceType = $competenceTypeMapper->fetchOneByUuid($dataPost['competency_type_id']);
188
                $dataPost['competency_type_id'] = $competenceType->id;
189
 
28 efrain 190
 
1098 geraldo 191
 
1 www 192
                $hydrator = new ObjectPropertyHydrator();
28 efrain 193
                $competence = new Competency();
1098 geraldo 194
 
28 efrain 195
                $hydrator->hydrate($dataPost, $competence);
1098 geraldo 196
 
197
                if ($currentCompany) {
28 efrain 198
                    $competence->company_id = $currentCompany->id;
199
                }
1 www 200
 
201
                $competenceMapper = CompetencyMapper::getInstance($this->adapter);
28 efrain 202
                $result = $competenceMapper->insert($competence);
1098 geraldo 203
 
204
                if ($result) {
28 efrain 205
                    $this->logger->info('Se agrego la competencia ' . $competence->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1098 geraldo 206
 
1140 geraldo 207
                    $behaviorCompetencyMapper = BehaviorCompetencyMapper::getInstance($this->adapter);
208
                    $behaviorCompetencyMapper->deleteAllBCompetencyId($competence->id);
209
 
210
                    $behaviors = json_decode($dataPost['behaviors'], true);
211
 
212
                    for ($i = 0; $i < count($behaviors); $i++) {
213
 
214
                        $behaviorCompetency = new BehaviorCompetency();
215
                        $behaviorCompetency->competency_id = $competency->id;
216
                        $behaviorCompetency->behavior_id = $behaviors[$i]['id'];
217
                        $behaviorCompetencyMapper->insert($behaviorCompetency);
218
                    }
219
 
1 www 220
                    $data = [
1098 geraldo 221
                        'success' => true,
222
                        'data' => 'LABEL_RECORD_ADDED'
1 www 223
                    ];
224
                } else {
225
                    $data = [
1098 geraldo 226
                        'success' => false,
227
                        'data' => $competenceMapper->getError()
1 www 228
                    ];
229
                }
1098 geraldo 230
 
1 www 231
                return new JsonModel($data);
232
            } else {
233
                $messages = [];
234
                $form_messages = (array) $form->getMessages();
1098 geraldo 235
                foreach ($form_messages as $fieldname => $field_messages) {
236
 
1 www 237
                    $messages[$fieldname] = array_values($field_messages);
238
                }
1098 geraldo 239
 
1 www 240
                return new JsonModel([
1098 geraldo 241
                    'success' => false,
242
                    'data' => $messages
1 www 243
                ]);
244
            }
245
        } else {
246
            $data = [
247
                'success' => false,
248
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
249
            ];
1098 geraldo 250
 
1 www 251
            return new JsonModel($data);
252
        }
1098 geraldo 253
 
1 www 254
        return new JsonModel($data);
255
    }
1098 geraldo 256
 
257
    public function editAction() {
1 www 258
        $currentUserPlugin = $this->plugin('currentUserPlugin');
259
        $currentUser = $currentUserPlugin->getUser();
28 efrain 260
        $currentCompany = $currentUserPlugin->getCompany();
1098 geraldo 261
 
1 www 262
        $request = $this->getRequest();
263
        $uuid = $this->params()->fromRoute('id');
264
 
1098 geraldo 265
 
266
        if (!$uuid) {
1 www 267
            $data = [
1098 geraldo 268
                'success' => false,
269
                'data' => 'ERROR_INVALID_PARAMETER'
1 www 270
            ];
1098 geraldo 271
 
1 www 272
            return new JsonModel($data);
273
        }
274
 
275
        $competenceMapper = CompetencyMapper::getInstance($this->adapter);
276
        $competence = $competenceMapper->fetchOneByUuid($uuid);
1098 geraldo 277
        if (!$competence) {
1 www 278
            $data = [
1098 geraldo 279
                'success' => false,
280
                'data' => 'ERROR_RECORD_NOT_FOUND'
1 www 281
            ];
1098 geraldo 282
 
1 www 283
            return new JsonModel($data);
284
        }
1098 geraldo 285
 
286
        if ($currentCompany) {
287
            if ($competence->company_id != $currentCompany->id) {
28 efrain 288
                $data = [
1098 geraldo 289
                    'success' => false,
290
                    'data' => 'ERROR_UNAUTHORIZED'
28 efrain 291
                ];
1098 geraldo 292
 
28 efrain 293
                return new JsonModel($data);
294
            }
295
        } else {
1098 geraldo 296
            if ($competence->company_id) {
28 efrain 297
                $data = [
1098 geraldo 298
                    'success' => false,
299
                    'data' => 'ERROR_UNAUTHORIZED'
28 efrain 300
                ];
1098 geraldo 301
 
28 efrain 302
                return new JsonModel($data);
303
            }
304
        }
1098 geraldo 305
 
306
        if ($request->isPost()) {
307
            if ($currentCompany) {
66 efrain 308
                $form = new CompetencyForm($this->adapter, $currentCompany->id);
309
            } else {
310
                $form = new CompetencyForm($this->adapter);
311
            }
1 www 312
            $dataPost = $request->getPost()->toArray();
1098 geraldo 313
 
314
 
1 www 315
            $form->setData($dataPost);
1098 geraldo 316
 
317
            if ($form->isValid()) {
1 www 318
                $dataPost = (array) $form->getData();
319
                $dataPost['status'] = $dataPost['status'] ? $dataPost['status'] : Competency::STATUS_INACTIVE;
1098 geraldo 320
 
1 www 321
                $competenceTypeMapper = CompetencyTypeMapper::getInstance($this->adapter);
322
                $competenceType = $competenceTypeMapper->fetchOneByUuid($dataPost['competency_type_id']);
323
                $dataPost['competency_type_id'] = $competenceType->id;
1098 geraldo 324
 
1 www 325
                $hydrator = new ObjectPropertyHydrator();
28 efrain 326
                $hydrator->hydrate($dataPost, $competence);
327
 
328
                $result = $competenceMapper->update($competence);
1098 geraldo 329
 
330
                if ($result) {
1 www 331
                    $this->logger->info('Se actualizo la competencia ' . $competenceType->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1098 geraldo 332
 
1 www 333
                    $data = [
334
                        'success' => true,
335
                        'data' => 'LABEL_RECORD_UPDATED'
336
                    ];
337
                } else {
338
                    $data = [
1098 geraldo 339
                        'success' => false,
340
                        'data' => $competenceMapper->getError()
1 www 341
                    ];
342
                }
1098 geraldo 343
 
1 www 344
                return new JsonModel($data);
345
            } else {
346
                $messages = [];
347
                $form_messages = (array) $form->getMessages();
1098 geraldo 348
                foreach ($form_messages as $fieldname => $field_messages) {
1 www 349
                    $messages[$fieldname] = array_values($field_messages);
350
                }
1098 geraldo 351
 
1 www 352
                return new JsonModel([
1098 geraldo 353
                    'success' => false,
354
                    'data' => $messages
1 www 355
                ]);
356
            }
357
        } else if ($request->isGet()) {
358
            $competenceTypeMapper = CompetencyTypeMapper::getInstance($this->adapter);
359
            $competenceType = $competenceTypeMapper->fetchOne($competence->competency_type_id);
1098 geraldo 360
 
1 www 361
            $hydrator = new ObjectPropertyHydrator();
1098 geraldo 362
 
1 www 363
            $data = $hydrator->extract($competence);
364
            $data['competency_type_id'] = $competenceType->uuid;
1141 geraldo 365
            $data['behaviors'] = [];
1098 geraldo 366
 
1141 geraldo 367
            $behaviorCompetencyMapper = CompetencyTypeMapper::getInstance($this->adapter);
368
 
369
            $records = $behaviorCompetencyMapper->fetchByCopetencyId($competence->id);
370
 
371
            $behaviorMapper = BehaviorsMapper::getInstance($this->adapter);
372
 
373
 
374
            foreach ($records as $record) {
375
                $behavior = $behaviorMapper->fetchOne($record->behavior_id);
376
                if ($behavior) {
377
                    array_push($data['behaviors'], [
378
                        'id' => $behavior->uuid,
379
                        'description' => $behavior->description,
380
                    ]);
381
                }
382
            }
383
 
1 www 384
            $response = [
385
                'success' => true,
386
                'data' => $data
387
            ];
1098 geraldo 388
 
1 www 389
            return new JsonModel($response);
390
        } else {
391
            $data = [
392
                'success' => false,
393
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
394
            ];
1098 geraldo 395
 
1 www 396
            return new JsonModel($data);
397
        }
1098 geraldo 398
 
1 www 399
        return new JsonModel($data);
400
    }
1098 geraldo 401
 
402
    public function deleteAction() {
1 www 403
        $currentUserPlugin = $this->plugin('currentUserPlugin');
404
        $currentUser = $currentUserPlugin->getUser();
28 efrain 405
        $currentCompany = $currentUserPlugin->getCompany();
1098 geraldo 406
 
1 www 407
        $request = $this->getRequest();
408
        $uuid = $this->params()->fromRoute('id');
1098 geraldo 409
 
410
        if (!$uuid) {
1 www 411
            $data = [
1098 geraldo 412
                'success' => false,
413
                'data' => 'ERROR_INVALID_PARAMETER'
1 www 414
            ];
1098 geraldo 415
 
1 www 416
            return new JsonModel($data);
417
        }
1098 geraldo 418
 
419
 
1 www 420
        $competenceMapper = CompetencyMapper::getInstance($this->adapter);
28 efrain 421
        $competence = $competenceMapper->fetchOneByUuid($uuid);
1098 geraldo 422
        if (!$competence) {
1 www 423
            $data = [
1098 geraldo 424
                'success' => false,
425
                'data' => 'ERROR_RECORD_NOT_FOUND'
1 www 426
            ];
1098 geraldo 427
 
1 www 428
            return new JsonModel($data);
429
        }
1098 geraldo 430
 
431
        if ($currentCompany) {
432
            if ($competence->company_id != $currentCompany->id) {
28 efrain 433
                $data = [
1098 geraldo 434
                    'success' => false,
435
                    'data' => 'ERROR_UNAUTHORIZED'
28 efrain 436
                ];
1098 geraldo 437
 
28 efrain 438
                return new JsonModel($data);
439
            }
440
        } else {
1098 geraldo 441
            if ($competence->company_id) {
28 efrain 442
                $data = [
1098 geraldo 443
                    'success' => false,
444
                    'data' => 'ERROR_UNAUTHORIZED'
28 efrain 445
                ];
1098 geraldo 446
 
28 efrain 447
                return new JsonModel($data);
448
            }
449
        }
1098 geraldo 450
 
451
        if ($request->isPost()) {
28 efrain 452
            $result = $competenceMapper->delete($competence);
1098 geraldo 453
            if ($result) {
28 efrain 454
                $this->logger->info('Se borro la competencia ' . $competence->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1098 geraldo 455
 
1 www 456
                $data = [
457
                    'success' => true,
458
                    'data' => 'LABEL_RECORD_DELETED'
459
                ];
460
            } else {
461
 
462
                $data = [
1098 geraldo 463
                    'success' => false,
464
                    'data' => $competenceMapper->getError()
1 www 465
                ];
466
 
467
                return new JsonModel($data);
468
            }
469
        } else {
470
            $data = [
471
                'success' => false,
472
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
473
            ];
1098 geraldo 474
 
1 www 475
            return new JsonModel($data);
476
        }
1098 geraldo 477
 
1 www 478
        return new JsonModel($data);
479
    }
1098 geraldo 480
 
481
    public function importAction() {
28 efrain 482
        $currentUserPlugin = $this->plugin('currentUserPlugin');
483
        $currentUser = $currentUserPlugin->getUser();
484
        $currentCompany = $currentUserPlugin->getCompany();
1098 geraldo 485
 
486
        if (!$currentCompany) {
28 efrain 487
            $data = [
488
                'success' => false,
489
                'data' => 'ERROR_UNAUTHORIZED'
490
            ];
1098 geraldo 491
 
28 efrain 492
            return new JsonModel($data);
493
        }
1098 geraldo 494
 
28 efrain 495
        $request = $this->getRequest();
1098 geraldo 496
 
497
        if ($request->isPost()) {
498
 
28 efrain 499
            $competencyTypeMapper = CompetencyTypeMapper::getInstance($this->adapter);
1098 geraldo 500
 
28 efrain 501
            $competenceMapper = CompetencyMapper::getInstance($this->adapter);
502
            $competenciesDefault = $competenceMapper->fetchAllByDefault();
1098 geraldo 503
 
28 efrain 504
            $new_records = 0;
1098 geraldo 505
            foreach ($competenciesDefault as $competencyDefault) {
28 efrain 506
 
1098 geraldo 507
                if ($competencyDefault->status == Competency::STATUS_INACTIVE) {
28 efrain 508
                    continue;
509
                }
1098 geraldo 510
 
28 efrain 511
                $competency = $competenceMapper->fetchOneByCompanyIdAndCompetencyIdDefault($currentCompany->id, $competencyDefault->id);
1098 geraldo 512
                if (!$competency) {
513
 
514
 
28 efrain 515
                    $competencyType = $competencyTypeMapper->fetchOneByCompanyId($currentCompany->id, $competencyDefault->competency_type_id);
1098 geraldo 516
                    if (!$competencyType) {
517
 
518
 
28 efrain 519
                        $competencyTypeDefault = $competencyTypeMapper->fetchOne($competencyDefault->competency_type_id);
1098 geraldo 520
                        if (!$competencyTypeDefault) {
28 efrain 521
                            continue;
522
                        }
1098 geraldo 523
 
28 efrain 524
                        $competencyType = new CompetencyType();
525
                        $competencyType->company_id = $currentCompany->id;
526
                        $competencyType->competency_type_id_default = $competencyTypeDefault->id;
527
                        $competencyType->description = $competencyTypeDefault->description;
528
                        $competencyType->name = $competencyTypeDefault->name;
529
                        $competencyType->status = CompetencyType::STATUS_ACTIVE;
1098 geraldo 530
 
531
 
532
                        if (!$competencyTypeMapper->insert($competencyType)) {
533
 
28 efrain 534
                            $data = [
535
                                'success' => false,
536
                                'data' => 'ERROR_CANT_ADD_COMPETENCY_TYPE'
537
                            ];
1098 geraldo 538
 
28 efrain 539
                            return new JsonModel($data);
1098 geraldo 540
                        }
28 efrain 541
                    }
1098 geraldo 542
 
543
 
28 efrain 544
                    $competency = new Competency();
545
                    $competency->competency_id_default = $competencyDefault->id;
546
                    $competency->behaviors = $competencyDefault->behaviors;
547
                    $competency->company_id = $currentCompany->id;
548
                    $competency->competency_type_id = $competencyType->id;
549
                    $competency->description = $competencyDefault->description;
550
                    $competency->name = $competencyDefault->name;
551
                    $competency->status = Competency::STATUS_ACTIVE;
1098 geraldo 552
 
553
 
554
 
555
                    if ($competenceMapper->insert($competency)) {
28 efrain 556
                        $new_records++;
557
                    } else {
558
                        $data = [
559
                            'success' => false,
560
                            'data' => 'ERROR_CANT ADD THE COMPETENCY'
561
                        ];
1098 geraldo 562
 
28 efrain 563
                        return new JsonModel($data);
564
                    }
565
                }
566
            }
1098 geraldo 567
 
568
            if ($new_records) {
569
 
570
                if (1 == $new_records) {
28 efrain 571
                    $data = [
572
                        'success' => true,
573
                        'data' => 'LABEL_1_COMPETENCY_IMPORTED'
574
                    ];
1098 geraldo 575
 
28 efrain 576
                    return new JsonModel($data);
577
                } else {
578
                    $data = [
579
                        'success' => true,
1098 geraldo 580
                        'data' => $new_records . ' LABEL_MULTI_COMPETENCIES_IMPORTED'
28 efrain 581
                    ];
1098 geraldo 582
 
28 efrain 583
                    return new JsonModel($data);
584
                }
585
            } else {
586
                $data = [
587
                    'success' => true,
588
                    'data' => 'LABEL_NO_COMPETENCY_IMPORTED'
589
                ];
1098 geraldo 590
 
28 efrain 591
                return new JsonModel($data);
592
            }
593
        } else {
594
            $data = [
595
                'success' => false,
596
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
597
            ];
1098 geraldo 598
 
28 efrain 599
            return new JsonModel($data);
600
        }
1098 geraldo 601
 
28 efrain 602
        return new JsonModel($data);
603
    }
1098 geraldo 604
 
1 www 605
}