1 <?php
2
3 namespace Objednavky;
4
5 use Nette\Application\UI;
6 use Nette\Utils\Html;
7 use Nette\Database\Table\Selection;
8 use Kdyby\BootstrapFormRenderer\BootstrapRenderer;
9 use PLus\Orders\Repositories;
10 use PLus\Orders\Factory;
11
12
13 14 15 16 17
18 class ExpertPresenter extends BasePresenter {
19
20
21 public $orderRepository;
22
23
24 public $ordertypeRepository;
25
26
27 public $realizationRepository;
28
29
30 public $timelineRepository;
31
32
33 public $itemorderRepository;
34
35
36 public $itemareastateRepository;
37
38
39 public $unituserRepository;
40
41
42 public $userRepository;
43
44
45 public $unitRepository;
46
47
48 public $documentFactory;
49
50
51 public $documenttypeRepository;
52
53
54 public $documentRepository;
55
56
57 public $chiefRepository;
58
59
60 public $traderRepository;
61
62
63 public $managerRepository;
64
65
66 public $areaRepository;
67
68
69 public $consultationRepository;
70
71
72 public $postRepository;
73
74
75 public $cfgRepository;
76
77
78 public $parameters;
79
80
81 public $mailerCfg;
82
83
84
85 public function createComponentExpertValidateGrid($name) {
86
87 $user = $this->getUser();
88
89 $grid = new \Grido\Grid($this, $name);
90 $areas = $this->areaRepository->findAreaById($user->getId());
91
92 $grid->setmodel($this->orderRepository->getGridSelectionExpertValidate($areas));
93
94 $grid->translator->lang = 'cs';
95 $grid->setDefaultSort(array('id' => 'ASC'));
96 $grid->defaultPerPage = 15;
97 $grid->filterRenderType = \Grido\Components\Filters\Filter::RENDER_OUTER;
98 $grid->setRememberState(FALSE);
99
100
101 $grid->addColumnText('id', 'ID')
102 ->setSortable()
103 ->setFilterText()
104 ->setWhere(function ($value, $connection) { $connection->where("order.id ?", $value);});
105 $grid->getColumn('id')->cellPrototype->class[] = 'center';
106 $grid->getColumn('id')->headerPrototype->style['width'] = '3%';
107
108 $grid->addColumnText('name', 'Předmět')
109 ->setSortable()
110 ->setColumn('name')
111 ->setFilterText()
112 ->setSuggestion(function ($item){ return $item->name; })
113 ->setColumn('name')
114 ->setWhere(function ($value, $connection){ $connection->where("order.name LIKE ?", "%$value%");});
115 $grid->getColumn('name')->headerPrototype->style['width'] = '15%';
116
117 $grid->addColumnDate('created', 'Vytvořeno')
118 ->setSortable()
119 ->setDateFormat(\Grido\Components\Columns\Date::FORMAT_DATE)
120 ->setFilterDate();
121 $grid->getColumn('created')->cellPrototype->class[] = 'center';
122
123 $grid->addColumnText('ns', 'NS')
124 ->setSortable()
125 ->setColumn('ns')
126 ->setFilterText()
127 ->setSuggestion(function ($item){ return $item->ns; })
128 ->setColumn('ns')
129 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.ns LIKE ?", "%$value%");});
130 $grid->getColumn('ns')->headerPrototype->style['width'] = '5%';
131
132 $grid->addColumnText('uname', 'Název')
133 ->setSortable()
134 ->setColumn('uname')
135 ->setFilterText()
136 ->setSuggestion(function ($item){ return $item->uname; })
137 ->setColumn('uname')
138 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.name LIKE ?", "%$value%");});
139 $grid->getColumn('uname')->headerPrototype->style['width'] = '13%';
140
141
142 $grid->addColumnText('tname', 'Typ')
143 ->setSortable()
144 ->setColumn('tname');
145 $grid->getColumn('tname')->headerPrototype->style['width'] = '5%';
146 $grid->addFilterSelect('tname', 'Typ', array('' => '') + $this->ordertypeRepository->getFilterData())
147 ->setWhere(function ($value, $connection){ $connection->where("ordertype.name LIKE ?", "%$value%");});
148
149 $grid->addColumnText('rname', 'Realizace')
150 ->setSortable()
151 ->setColumn('rname');
152 $grid->getColumn('rname')->headerPrototype->style['width'] = '15%';
153 $grid->addFilterSelect('rname', 'Realizace', array('' => '') + $this->realizationRepository->getFilterData())
154 ->setWhere(function ($value, $connection){ $connection->where("realization.name LIKE ?", "%$value%");});
155
156 $grid->addActionHref('view', 'Zobrazit')
157 ->setIcon('fa fa-eye fa-fw');
158
159
160 $grid->setExport();
161 }
162
163
164 public function createComponentExpertClosedGrid($name) {
165
166 $user = $this->getUser();
167
168 $grid = new \Grido\Grid($this, $name);
169 $areas = $this->areaRepository->findAreaById($user->getId());
170 $grid->setmodel($this->orderRepository->getGridSelectionExpertClosed($areas));
171
172 $grid->translator->lang = 'cs';
173 $grid->setDefaultSort(array('id' => 'DESC'));
174 $grid->defaultPerPage = 15;
175 $grid->filterRenderType = \Grido\Components\Filters\Filter::RENDER_OUTER;
176 $grid->setRememberState(FALSE);
177
178
179 $grid->addColumnText('id', 'ID')
180 ->setSortable()
181 ->setFilterText()
182 ->setWhere(function ($value, $connection) { $connection->where("order.id ?", $value);});
183 $grid->getColumn('id')->cellPrototype->class[] = 'center';
184 $grid->getColumn('id')->headerPrototype->style['width'] = '3%';
185
186 $grid->addColumnText('name', 'Předmět')
187 ->setSortable()
188 ->setColumn('name')
189 ->setFilterText()
190 ->setSuggestion(function ($item){ return $item->name; })
191 ->setColumn('name')
192 ->setWhere(function ($value, $connection){ $connection->where("order.name LIKE ?", "%$value%");});
193 $grid->getColumn('name')->headerPrototype->style['width'] = '15%';
194
195 $grid->addColumnDate('created', 'Vytvořeno')
196 ->setSortable()
197 ->setDateFormat(\Grido\Components\Columns\Date::FORMAT_DATE)
198 ->setFilterDate();
199 $grid->getColumn('created')->cellPrototype->class[] = 'center';
200
201 $grid->addColumnText('ns', 'NS')
202 ->setSortable()
203 ->setColumn('ns')
204 ->setFilterText()
205 ->setSuggestion(function ($item){ return $item->ns; })
206 ->setColumn('ns')
207 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.ns LIKE ?", "%$value%");});
208 $grid->getColumn('ns')->headerPrototype->style['width'] = '4%';
209
210 $grid->addColumnText('uname', 'Název')
211 ->setSortable()
212 ->setColumn('uname')
213 ->setFilterText()
214 ->setSuggestion(function ($item){ return $item->uname; })
215 ->setColumn('uname')
216 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.name LIKE ?", "%$value%");});
217 $grid->getColumn('uname')->headerPrototype->style['width'] = '13%';
218
219 $grid->addFilterSelect('tname', 'Typ', array('' => '') + $this->ordertypeRepository->getFilterData())
220 ->setWhere(function ($value, $connection){ $connection->where("ordertype.name LIKE ?", "%$value%");});
221
222 $grid->addFilterSelect('rname', 'Realizace', array('' => '') + $this->realizationRepository->getFilterData())
223 ->setWhere(function ($value, $connection){ $connection->where("realization.name LIKE ?", "%$value%");});
224
225 $column = new \Grido\Components\Columns\Boolean($grid, 'mapproved', 'Schváleno');
226 $column->setSortable()->headerPrototype->style['width'] ='4%';
227 $grid->getColumn('mapproved')->headerPrototype->class[] = 'center';
228 $grid->addFilterCheck('approved', 'Jen schválené objednávky')
229 ->setWhere(function($value, $connection) {$value ? $connection->where(':managerresult.approved ?' , '1'): NULL;});
230
231 $columna = new \Grido\Components\Columns\BooleanExtension($grid, 'impacceptflag', 'Přijato');
232 $columna->setSortable()->headerPrototype->style['width'] ='4%';
233 $grid->getColumn('impacceptflag')->headerPrototype->class[] = 'center';
234 $grid->addFilterCheck('impacceptflag', 'Jen objednávky přijaté řešiteli k realizaci')
235 ->setWhere(function($value, $connection) {$value ? $connection->where('order.impacceptflag ?' , '2'): NULL;});
236
237 $columnr = new \Grido\Components\Columns\Boolean($grid, 'realizedflag', 'Realizováno');
238 $columnr->setSortable()->headerPrototype->style['width'] ='4%';
239 $grid->getColumn('realizedflag')->headerPrototype->class[] = 'center';
240 $grid->addFilterCheck('norealized', 'Jen nerealizované objednávky')
241 ->setWhere(function($value, $connection) {$value ? $connection->where('order.realizedflag' , NULL): NULL;});
242
243
244 $grid->addActionHref('view', 'Zobrazit')
245 ->setIcon('fa fa-eye fa-fw');
246
247
248 $grid->setExport();
249 }
250
251
252
253 public function createComponentExpertToRealizeGrid($name) {
254
255
256 $user_id = $this->getUser()->getId();
257
258 $grid = new \Grido\Grid($this, $name);
259 $orders = $this->itemorderRepository->findOrderByImplementerId($user_id);
260 $grid->setmodel($this->orderRepository->getGridSelectionExpertToRealize($orders));
261
262 $grid->translator->lang = 'cs';
263 $grid->defaultPerPage = 15;
264 $grid->filterRenderType = \Grido\Components\Filters\Filter::RENDER_OUTER;
265 $grid->setRememberState(FALSE);
266
267
268 $grid->addColumnText('id', 'ID')
269 ->setSortable()
270 ->setFilterText()
271 ->setWhere(function ($value, $connection) { $connection->where("order.id ?", $value);});
272 $grid->getColumn('id')->cellPrototype->class[] = 'center';
273 $grid->getColumn('id')->headerPrototype->style['width'] = '3%';
274
275 $grid->addColumnText('name', 'Předmět')
276 ->setSortable()
277 ->setColumn('name')
278 ->setFilterText()
279 ->setSuggestion(function ($item){ return $item->name; })
280 ->setColumn('name')
281 ->setWhere(function ($value, $connection){ $connection->where("order.name LIKE ?", "%$value%");});
282 $grid->getColumn('name')->headerPrototype->style['width'] = '15%';
283
284 $grid->addColumnDate('created', 'Vytvořeno')
285 ->setSortable()
286 ->setDateFormat(\Grido\Components\Columns\Date::FORMAT_DATE)
287 ->setFilterDate();
288 $grid->getColumn('created')->cellPrototype->class[] = 'center';
289
290 $grid->addColumnText('ns', 'NS')
291 ->setSortable()
292 ->setColumn('ns')
293 ->setFilterText()
294 ->setSuggestion(function ($item){ return $item->ns; })
295 ->setColumn('ns')
296 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.ns LIKE ?", "%$value%");});
297 $grid->getColumn('ns')->headerPrototype->style['width'] = '5%';
298
299 $grid->addColumnText('uname', 'Název')
300 ->setSortable()
301 ->setColumn('uname')
302 ->setFilterText()
303 ->setSuggestion(function ($item){ return $item->uname; })
304 ->setColumn('uname')
305 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.name LIKE ?", "%$value%");});
306 $grid->getColumn('uname')->headerPrototype->style['width'] = '13%';
307
308 $grid->addColumnText('tname', 'Typ')
309 ->setSortable()
310 ->setColumn('tname');
311 $grid->getColumn('tname')->headerPrototype->style['width'] = '5%';
312 $grid->addFilterSelect('tname', 'Typ', array('' => '') + $this->ordertypeRepository->getFilterData())
313 ->setWhere(function ($value, $connection){ $connection->where("ordertype.name LIKE ?", "%$value%");});
314
315
316
317
318
319 $grid->addFilterSelect('rname', 'Realizace', array('' => '') + $this->realizationRepository->getFilterData())
320 ->setWhere(function ($value, $connection){ $connection->where("realization.name LIKE ?", "%$value%");});
321
322 $columna = new \Grido\Components\Columns\BooleanExtension($grid, 'impacceptflag', 'Přijato');
323 $columna->setSortable()->headerPrototype->style['width'] ='4%';
324 $grid->getColumn('impacceptflag')->headerPrototype->class[] = 'center';
325 $grid->addFilterCheck('impacceptflag', 'Jen objednávky přijaté řešiteli k realizaci')
326 ->setWhere(function($value, $connection) {$value ? $connection->where('order.impacceptflag ?' , '2'): NULL;});
327
328
329 $grid->addActionHref('view', 'Zobrazit')
330 ->setIcon('fa fa-eye fa-fw');
331
332
333 $grid->setExport();
334 }
335
336 337 338 339 340
341 public function createComponentExpertAllGrid($name) {
342
343 $user = $this->getUser();
344
345 $grid = new \Grido\Grid($this, $name);
346 $grid->setmodel($this->orderRepository->getGridSelectionOrdersAll());
347
348 $grid->translator->lang = 'cs';
349 $grid->setDefaultSort(array('id' => 'DESC'));
350 $grid->defaultPerPage = 15;
351 $grid->filterRenderType = \Grido\Components\Filters\Filter::RENDER_OUTER;
352 $grid->setRememberState(FALSE);
353
354
355 $grid->addColumnText('id', 'ID')
356 ->setSortable()
357 ->setFilterText()
358 ->setWhere(function ($value, $connection) { $connection->where("order.id ?", $value);});
359 $grid->getColumn('id')->cellPrototype->class[] = 'center';
360 $grid->getColumn('id')->headerPrototype->style['width'] = '3%';
361
362 $grid->addColumnText('name', 'Předmět')
363 ->setSortable()
364 ->setColumn('name')
365 ->setFilterText()
366 ->setSuggestion(function ($item){ return $item->name; })
367 ->setColumn('name')
368 ->setWhere(function ($value, $connection){ $connection->where("order.name LIKE ?", "%$value%");});
369 $grid->getColumn('name')->headerPrototype->style['width'] = '15%';
370
371 $grid->addColumnDate('created', 'Vytvořeno')
372 ->setSortable()
373 ->setDateFormat(\Grido\Components\Columns\Date::FORMAT_DATE)
374 ->setFilterDate();
375 $grid->getColumn('created')->cellPrototype->class[] = 'center';
376
377 $grid->addColumnText('ns', 'NS')
378 ->setSortable()
379 ->setColumn('ns')
380 ->setFilterText()
381 ->setSuggestion(function ($item){ return $item->ns; })
382 ->setColumn('ns')
383 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.ns LIKE ?", "%$value%");});
384 $grid->getColumn('ns')->headerPrototype->style['width'] = '4%';
385
386 $grid->addColumnText('uname', 'Název')
387 ->setSortable()
388 ->setColumn('uname')
389 ->setFilterText()
390 ->setSuggestion(function ($item){ return $item->uname; })
391 ->setColumn('uname')
392 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.name LIKE ?", "%$value%");});
393 $grid->getColumn('uname')->headerPrototype->style['width'] = '13%';
394
395 $grid->addColumnText('tname', 'Typ')
396 ->setSortable()
397 ->setColumn('tname');
398 $grid->getColumn('tname')->headerPrototype->style['width'] = '5%';
399 $grid->addFilterSelect('tname', 'Typ', array('' => '') + $this->ordertypeRepository->getFilterData())
400 ->setWhere(function ($value, $connection){ $connection->where("ordertype.name LIKE ?", "%$value%");});
401
402
403
404
405
406 $grid->addFilterSelect('rname', 'Realizace', array('' => '') + $this->realizationRepository->getFilterData())
407 ->setWhere(function ($value, $connection){ $connection->where("realization.name LIKE ?", "%$value%");});
408
409 $column = new \Grido\Components\Columns\Boolean($grid, 'mapproved', 'Schváleno');
410 $column->setSortable()->headerPrototype->style['width'] ='4%';
411 $grid->getColumn('mapproved')->headerPrototype->class[] = 'center';
412 $grid->addFilterCheck('approved', 'Jen schválené objednávky')
413 ->setWhere(function($value, $connection) {$value ? $connection->where(':managerresult.approved ?' , '1'): NULL;});
414
415
416 $columnr = new \Grido\Components\Columns\Boolean($grid, 'realizedflag', 'Realizováno');
417 $columnr->setSortable()->headerPrototype->style['width'] ='4%';
418 $grid->getColumn('realizedflag')->headerPrototype->class[] = 'center';
419 $grid->addFilterCheck('norealized', 'Jen nerealizované objednávky')
420 ->setWhere(function($value, $connection) {$value ? $connection->where('order.realizedflag' , NULL): NULL;});
421
422 $grid->addActionHref('view', 'Zobrazit')
423 ->setIcon('fa fa-eye fa-fw');
424
425
426 $grid->setExport();
427 }
428
429
430
431
432 public function renderView($id){
433
434 $item = $this->orderRepository->findById($id);
435 $user = $this->getUser();
436
437 if ($item === false) {
438 $this->flashMessage('Objednávka č. '. $id .' nebyla dohledána.', 'error');
439 $this->redirect('Homepage:default');
440 }
441
442
443 $areaUser = $this->areaRepository->findAreaById($user->getId());
444 $orderbyid = $this->orderRepository->findOrderForExpert($areaUser, $id);
445
446 if($orderbyid === false && !$user->isInRole('admin')){
447 $this->flashMessage('Nemáte právo přístupu k objednávce č. '.$id, 'error');
448 $this->redirect('Homepage:default');
449 }
450 else if ($user->isInRole('admin'))
451 $this->template->orderdetail = $this->orderRepository->findOrderForTrader($id);
452 else {
453 $this->template->orderdetail = $orderbyid;
454 }
455
456 $this->template->timelineevents = $this->timelineRepository->getTimelineRecords($id);
457
458 $this->template->documentRepository = $this->documentRepository;
459 $this->template->documents = $this->orderRepository->getAssignedDocuments($item->id);
460
461 $this->template->itemsorder = $this->itemorderRepository->getItemsOrder($id);
462
463
464 $this->template->chiefresults = $this->chiefRepository->getChiefResults($item->id);
465 $this->template->traderresults = $this->traderRepository->getTraderResults($item->id);
466 $this->template->managerresults = $this->managerRepository->getManagerResults($item->id);
467
468
469 $consultations = $this->consultationRepository->getConsultationHeader($user->getId(), $item->id);
470 if ($consultations->fetch() != NULL) {
471 $this->template->consultations = $consultations;
472 }
473 else {
474 $this->template->consultations = NULL;
475 }
476
477
478
479 $this->template->maxsizedoc = $this->parameters->formatBytes($this->parameters->getMaxSizeUpload());
480
481
482 $this->template->icons = $this->cfgRepository->getTimelineIcons();
483 $this->template->colors = $this->cfgRepository->getTimelineColors();
484 $this->template->inverted = $this->cfgRepository->getTimelineInverted();
485
486
487 $mySection = $this->getSession()->getSection('history');
488 $mySection->beforePresenter = 'Expert';
489 $mySection->beforeId = $id;
490 $mySection->setExpiration(0);
491 }
492
493
494 495 496 497 498
499 public function createComponentAddDocument() {
500
501 try {
502 $iduser = $this->getUser()->getId();
503 $idorder = $this->getParameter('id');
504
505 $form = $this->documentFactory->createAddDocument($idorder,$iduser);
506 $this->flashMessage('Soubor byl uložen.', 'success');
507
508 return $form;
509
510 } catch (\PDOException $e) {
511 $this->flashMessage("Soubor se nepodařilo uložit!", "error");
512 }
513 }
514
515 516 517 518 519
520 public function createComponentUpdateNameDocument(){
521
522 try {
523 $form = $this->documentFactory->createUpdateNameDocument();
524 $this->flashMessage('Dokument byl úspěšně pojmenován.', 'success');
525
526 return $form;
527
528 } catch (\PDOException $e) {
529 $this->flashMessage('Chyba při uložení do DB.', 'error');
530 }
531 }
532
533 534 535 536
537 public function createComponentDeleteDocument() {
538 try {
539 $form = $this->documentFactory->createDeleteDocument();
540 $this->flashMessage('Dokument byl odstraněn.', 'success');
541
542 return $form;
543
544 } catch (Exception $e) {
545 $this->flashMessage('Chyba. Dokument se nepodařilo odstranit.', 'error');
546 }
547 }
548
549
550 551 552 553 554
555 public function createComponentAddConsultation() {
556
557 $form = new UI\Form();
558 $form->setRenderer(new BootstrapRenderer());
559
560 $user = $this->getUser();
561 $roles = array('director','manager','trader');
562
563 $form->getElementPrototype()->class = 'form-horizontal';
564
565
566 $area_ids = $this->areaRepository->getAreasFromOrder($this->getParameter('id'));
567 $form->addSelect('to_id', 'Komu:', $this->userRepository->findUserByRole($roles, $user->getId()) + $this->userRepository->getUserByAreaOrderLastname($area_ids, $user->getId()))
568 ->setPrompt('Vyberte adresáta ...')
569 ->setRequired()
570 ->setAttribute('class', 'form-control');
571
572 $form->addTextArea('post', 'Zpráva:', NULL, 10)
573 ->setAttribute('class', 'form-control')
574 ->setAttribute('type', 'modal')
575 ->setRequired('Vložte odpověď');
576
577 $form->addSubmit('send', 'Odeslat')
578 ->setAttribute('class', 'btn btn-primary');
579
580 $form->onSuccess[] = array($this, 'addConsultation');
581
582 return $form;
583 }
584
585 public function addConsultation($form, $values) {
586 try {
587 $user = $this->getUser();
588 $order_id = $this->getParameter('id');
589
590 if(mb_strlen(trim($values->post)) > 0) {
591
592
593 $newconsultation = $this->consultationRepository->insertData(array(
594 'created' => date('Y-m-d H:i:s'),
595 'order_id' => $order_id,
596 'from' => $user->getId(),
597 'to' => $values->to_id,
598 'lastmod' => NULL,
599 'lastpostman' => $user->getId(),
600 'visit' => 1
601 ));
602
603
604 $this->postRepository->insertData(array(
605 'consultation_id' => $newconsultation->id,
606 'user_id' => $user->getId(),
607 'created' => date('Y-m-d H:i:s'),
608 'message' => $values->post
609 ));
610
611
612 $uri = $this->getHttpRequest()->getUrl();
613 $from = $this->parameters->getFrom();
614 $support = $this->parameters->getSupport();
615
616 $to = $this->userRepository->getUserEmail($values->to_id);
617 $roles = $this->roleRepository->findRoleById($values->to_id);
618
619 $is_consultant = FALSE;
620 foreach ($roles as $role) {
621 if($role == 'consultant') {
622 $is_consultant = TRUE;
623 }
624 }
625 $subject = 'Konzultace k objednávce';
626 $params = array(
627 'order_id' => $order_id,
628 'contact' => $support,
629 'url' => $uri->hostUrl.'/consultant&execution=view&id='.$order_id,
630 'consultation_id' => $newconsultation->id,
631 'path' => ($is_consultant)? 'Konzultant' : 'Konzultace'
632
633 );
634 $template = __DIR__ . '/../templates/Mailer/emailToConsultantFirst.latte';
635 $image = __DIR__ . '/../../www/img/logo32x32.gif';
636 $mailer = $this->mailerCfg->getMailConfig();
637
638 MailerPresenter::sendMail($from, $to, $subject, $params, $template, $image, $mailer);
639
640
641 $this->flashMessage('Požadavek na konzultaci byl uložen.', 'success');
642 $this->redirect('this');
643
644 }
645 else {
646 $this->flashMessage('Nelze uložit prázdnou konzultaci.', 'error');
647 }
648
649 }
650 catch (\PDOException $ex) {
651 $this->flashMessage('Chyba při uložení konzultace.', 'error');
652 }
653 }
654
655 }
656