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