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 DirectorPresenter extends BasePresenter {
19
20
21 public $areaRepository;
22
23
24 public $consultationRepository;
25
26
27 public $postRepository;
28
29
30 public $orderRepository;
31
32
33 public $ordertypeRepository;
34
35
36 public $realizationRepository;
37
38
39 public $timelineRepository;
40
41
42 public $itemorderRepository;
43
44
45 public $unituserRepository;
46
47
48 public $userRepository;
49
50
51 public $unitRepository;
52
53
54 public $documentFactory;
55
56
57 public $documenttypeRepository;
58
59
60 public $documentRepository;
61
62
63 public $chiefRepository;
64
65
66 public $traderRepository;
67
68
69 public $managerRepository;
70
71
72 public $cfgRepository;
73
74
75 public $parameters;
76
77
78 public $mailerCfg;
79
80
81
82
83 84 85 86 87
88 public function createComponentDirectorAllGrid($name) {
89
90 $user = $this->getUser();
91
92 $grid = new \Grido\Grid($this, $name);
93 $grid->setmodel($this->orderRepository->getGridSelectionOrdersAll());
94
95 $grid->translator->lang = 'cs';
96 $grid->setDefaultSort(array('id' => 'DESC'));
97 $grid->defaultPerPage = 15;
98 $grid->filterRenderType = \Grido\Components\Filters\Filter::RENDER_OUTER;
99 $grid->setRememberState(FALSE);
100
101
102 $grid->addColumnText('id', 'ID')
103 ->setSortable()
104 ->setFilterText()
105 ->setWhere(function ($value, $connection) { $connection->where("order.id ?", $value);});
106 $grid->getColumn('id')->cellPrototype->class[] = 'center';
107 $grid->getColumn('id')->headerPrototype->style['width'] = '3%';
108
109 $grid->addColumnText('name', 'Předmět')
110 ->setSortable()
111 ->setColumn('name')
112 ->setFilterText()
113 ->setSuggestion(function ($item){ return $item->name; })
114 ->setColumn('name')
115 ->setWhere(function ($value, $connection){ $connection->where("order.name LIKE ?", "%$value%");});
116 $grid->getColumn('name')->headerPrototype->style['width'] = '15%';
117
118 $grid->addColumnDate('created', 'Vytvořeno')
119 ->setSortable()
120 ->setDateFormat(\Grido\Components\Columns\Date::FORMAT_DATE)
121 ->setFilterDate();
122 $grid->getColumn('created')->cellPrototype->class[] = 'center';
123
124 $grid->addColumnText('ns', 'NS')
125 ->setSortable()
126 ->setColumn('ns')
127 ->setFilterText()
128 ->setSuggestion(function ($item){ return $item->ns; })
129 ->setColumn('ns')
130 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.ns LIKE ?", "%$value%");});
131 $grid->getColumn('ns')->headerPrototype->style['width'] = '4%';
132
133 $grid->addColumnText('uname', 'Název')
134 ->setSortable()
135 ->setColumn('uname')
136 ->setFilterText()
137 ->setSuggestion(function ($item){ return $item->uname; })
138 ->setColumn('uname')
139 ->setWhere(function ($value, $connection){ $connection->where("user:unit_user.unit.name LIKE ?", "%$value%");});
140 $grid->getColumn('uname')->headerPrototype->style['width'] = '13%';
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
150
151
152
153 $grid->addFilterSelect('rname', 'Realizace', array('' => '') + $this->realizationRepository->getFilterData())
154 ->setWhere(function ($value, $connection){ $connection->where("realization.name LIKE ?", "%$value%");});
155
156 $column = new \Grido\Components\Columns\Boolean($grid, 'mapproved', 'Schváleno');
157 $column->setSortable()->headerPrototype->style['width'] ='4%';
158 $grid->getColumn('mapproved')->headerPrototype->class[] = 'center';
159 $grid->addFilterCheck('approved', 'Jen schválené objednávky')
160 ->setWhere(function($value, $connection) {$value ? $connection->where(':managerresult.approved ?' , '1'): NULL;});
161
162
163 $columnr = new \Grido\Components\Columns\Boolean($grid, 'realizedflag', 'Realizováno');
164 $columnr->setSortable()->headerPrototype->style['width'] ='4%';
165 $grid->getColumn('realizedflag')->headerPrototype->class[] = 'center';
166 $grid->addFilterCheck('norealized', 'Jen nerealizované objednávky')
167 ->setWhere(function($value, $connection) {$value ? $connection->where('order.realizedflag' , NULL): NULL;});
168
169 $grid->addActionHref('view', 'Zobrazit')
170 ->setIcon('fa fa-eye fa-fw');
171
172
173 $grid->setExport();
174 }
175
176
177
178 public function renderView($id){
179
180 $item = $this->orderRepository->findById($id);
181 $user = $this->getUser();
182
183 if ($item === false) {
184 $this->flashMessage('Objednávka č. '. $id .' nebyla dohledána.', 'error');
185 $this->redirect('Homepage:default');
186 }
187
188 $this->template->orderdetail = $this->orderRepository->findOrderForTrader($id);
189 $this->template->timelineevents = $this->timelineRepository->getTimelineRecords($id);
190
191 $this->template->documentRepository = $this->documentRepository;
192 $this->template->documents = $this->orderRepository->getAssignedDocuments($item->id);
193
194 $this->template->itemsorder = $this->itemorderRepository->getItemsOrder($id);
195
196
197 $this->template->chiefresults = $this->chiefRepository->getChiefResults($item->id);
198 $this->template->traderresults = $this->traderRepository->getTraderResults($item->id);
199 $this->template->managerresults = $this->managerRepository->getManagerResults($item->id);
200
201 $iditems = $this->itemorderRepository->getIdItemsOrder($item->id);
202
203 $this->template->maxsizedoc = $this->parameters->formatBytes($this->parameters->getMaxSizeUpload());
204
205
206 $consultations = $this->consultationRepository->getConsultationHeader($user->getId(), $item->id);
207 if ($consultations->fetch() != NULL) {
208 $this->template->consultations = $consultations;
209 }
210 else {
211 $this->template->consultations = NULL;
212 }
213
214
215 $this->template->icons = $this->cfgRepository->getTimelineIcons();
216 $this->template->colors = $this->cfgRepository->getTimelineColors();
217 $this->template->inverted = $this->cfgRepository->getTimelineInverted();
218
219
220 $mySection = $this->getSession()->getSection('history');
221 $mySection->beforePresenter = 'Director';
222 $mySection->setExpiration(0);
223
224 }
225
226 227 228 229 230
231 public function createComponentAddDocument() {
232
233 try {
234 $iduser = $this->getUser()->getId();
235 $idorder = $this->getParameter('id');
236
237 $form = $this->documentFactory->createAddDocument($idorder,$iduser);
238 $this->flashMessage('Soubor byl uložen.', 'success');
239
240 return $form;
241
242 } catch (\PDOException $e) {
243 $this->flashMessage("Soubor se nepodařilo uložit!", "error");
244 }
245
246 }
247
248 249 250 251 252
253 public function createComponentUpdateNameDocument(){
254
255 try {
256 $form = $this->documentFactory->createUpdateNameDocument();
257 $this->flashMessage('Dokument byl úspěšně pojmenován.', 'success');
258
259 return $form;
260
261 } catch (\PDOException $e) {
262 $this->flashMessage('Chyba při uložení do DB.', 'error');
263 }
264 }
265
266 267 268 269
270 public function createComponentDeleteDocument() {
271 try {
272 $form = $this->documentFactory->createDeleteDocument();
273 $this->flashMessage('Dokument byl odstraněn.', 'success');
274
275 return $form;
276
277 } catch (Exception $e) {
278 $this->flashMessage('Chyba. Dokument se nepodařilo odstranit.', 'error');
279 }
280 }
281
282 283 284 285 286
287 public function createComponentAddConsultation() {
288
289 $form = new UI\Form();
290 $form->setRenderer(new BootstrapRenderer());
291
292 $user = $this->getUser();
293 $roles = array('director','manager','trader');
294
295 $form->getElementPrototype()->class = 'form-horizontal';
296
297
298 $area_ids = $this->areaRepository->getAreasFromOrder($this->getParameter('id'));
299 $form->addSelect('to_id', 'Komu:', $this->userRepository->findUserByRole($roles, $user->getId()) + $this->userRepository->getUserByAreaOrderLastname($area_ids, $user->getId()))
300 ->setPrompt('Vyberte adresáta ...')
301 ->setRequired()
302 ->setAttribute('class', 'form-control');
303
304 $form->addTextArea('post', 'Zpráva:', NULL, 10)
305 ->setAttribute('class', 'form-control')
306 ->setAttribute('type', 'modal')
307 ->setRequired('Vložte odpověď');
308
309 $form->addSubmit('send', 'Odeslat')
310 ->setAttribute('class', 'btn btn-primary');
311
312 $form->onSuccess[] = array($this, 'addConsultation');
313
314 return $form;
315 }
316
317 public function addConsultation($form, $values) {
318 try {
319 $user = $this->getUser();
320 $order_id = $this->getParameter('id');
321
322 if(mb_strlen(trim($values->post)) > 0) {
323
324
325 $newconsultation = $this->consultationRepository->insertData(array(
326 'created' => date('Y-m-d H:i:s'),
327 'order_id' => $order_id,
328 'from' => $user->getId(),
329 'to' => $values->to_id,
330 'lastmod' => NULL,
331 'lastpostman' => $user->getId(),
332 'visit' => 1
333 ));
334
335
336 $this->postRepository->insertData(array(
337 'consultation_id' => $newconsultation->id,
338 'user_id' => $user->getId(),
339 'created' => date('Y-m-d H:i:s'),
340 'message' => $values->post
341 ));
342
343
344 $uri = $this->getHttpRequest()->getUrl();
345 $from = $this->parameters->getFrom();
346 $support = $this->parameters->getSupport();
347
348 $to = $this->userRepository->getUserEmail($values->to_id);
349 $roles = $this->roleRepository->findRoleById($values->to_id);
350
351 $is_consultant = FALSE;
352 foreach ($roles as $role) {
353 if($role == 'consultant') {
354 $is_consultant = TRUE;
355 }
356 }
357 $subject = 'Konzultace k objednávce';
358 $params = array(
359 'order_id' => $order_id,
360 'contact' => $support,
361 'url' => $uri->hostUrl.'/consultant&execution=view&id='.$order_id,
362 'consultation_id' => $newconsultation->id,
363 'path' => ($is_consultant)? 'Konzultant' : 'Konzultace'
364
365 );
366 $template = __DIR__ . '/../templates/Mailer/emailToConsultantFirst.latte';
367 $image = __DIR__ . '/../../www/img/logo32x32.gif';
368 $mailer = $this->mailerCfg->getMailConfig();
369
370 MailerPresenter::sendMail($from, $to, $subject, $params, $template, $image, $mailer);
371
372
373 $this->flashMessage('Požadavek na konzultaci byl uložen.', 'success');
374 $this->redirect('this');
375
376 }
377 else {
378 $this->flashMessage('Nelze uložit prázdnou konzultaci.', 'error');
379 }
380
381 }
382 catch (\PDOException $ex) {
383 $this->flashMessage('Chyba při uložení konzultace.', 'error');
384 }
385 }
386 }
387