コード例 #1
0
 public function actionEdit()
 {
     // Получим номер запрашиваемой заявки, ее статус и цех-создатель
     // для проверки возможности редактирования
     $req_id = get_param($this->arguments, 0);
     $req_id = filter_var($req_id, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'default' => -1]]);
     $this->render('', false);
     $ticket = $this->model->getTicketInfo($req_id);
     $my_dep = get_param($this->authdata, 'depid');
     //if (get_param($this->authdata, 'role_id') === Configuration::$ROLE_NSS) $this->render('info', false);
     if (!$ticket) {
         $this->preparePopup('Заявка не найдена', 'alert-warning');
         $this->redirect('/contents/');
     } elseif (get_param($ticket, 'status') == STATUS_DRAFT) {
         if (get_param($ticket, 'department_id') != $my_dep) {
             $this->preparePopup('Редактировать черновики чужого цеха запрещено');
             $this->redirect('/contents/');
         }
     }
     $this->data['title'] = 'Редактирование заявки ';
     $this->data['t_number'] = get_param($ticket, 'number');
     $this->data['t_cdate'] = sqldate2human(get_param($ticket, 'dt_create'), 'd.m.Y');
     $this->data['t_message'] = get_param($ticket, 'message');
     $this->data['t_id'] = $req_id;
     $this->data['parent'] = '';
     $departments = $this->model->getDepartments();
     $tdepid = get_param($ticket, 'department_id');
     $deplist = array_column($departments, 'title', 'id');
     // цех создатель
     $this->data['t_department'] = get_param($deplist, $tdepid, '?');
     // цех согласователь
     $agree = get_param($ticket, 'agree');
     $adepid = get_param($agree, 'department_id', -1);
     $adepname = get_param($deplist, $adepid, null);
     // Название цеха, кто должен согласовать
     $ares = get_param($agree, 'result');
     // null - пока не указанно; 0 - отказ; 1 - добро
     //$this->data['departments'] = generateOptions($departments, $adepid, 'Не требуется');
     // Список отделов с заблокировкой текущего цеха и отметкой выбранного
     $this->data['departments'] = CHtml::createTag('option', ['value' => ''], 'Не требуется');
     foreach ($deplist as $id => $title) {
         $param = [];
         $param['value'] = $id;
         if ($id == $my_dep) {
             $param['disabled'] = true;
         }
         if ($id == $adepid) {
             $param['selected'] = true;
         }
         $this->data['departments'] .= CHtml::createTag('option', $param, $title);
     }
     // пользователь создавший заявку
     $uid = get_param($ticket, 'user_id');
     $user = $this->model->getUserName($uid);
     $this->data['t_user'] = get_param($user, 'fullname', '?');
     // Информация по выбранному узлу
     $nodes = $this->model->getNodes();
     $nodeid = get_param($ticket, 'node_id');
     $nlist = array_column($nodes, 'title', 'id');
     $this->data['nodename'] = get_param($nlist, $nodeid, '?');
     // получим список устройств узла, и нарисуем чекбокс-лист
     // но изменим порядок, чтобы спервы отрисовались отмеченные в заявке устройства
     $dlist = $this->model->getDevices($nodeid);
     $dlist = array_column($dlist, 'name', 'id');
     $devs = get_param($ticket, 'devices', []);
     $this->data['tstart'] = sqldate2human(get_param($ticket, 'dt_start'));
     $this->data['tstop'] = sqldate2human(get_param($ticket, 'dt_stop'));
     $this->data['resolutions'] = '';
     $ticket_status = intval(get_param($ticket, 'status', -1));
     if ($ticket_status === STATUS_DRAFT) {
         // кнопка удаления заявки доступна только из черновика
         $this->data['buttons'] = join(PHP_EOL, [CHtml::createLink('Удалить', "/ticket/delete/{$req_id}/", ['class' => 'btn btn-danger']), CHtml::createButton('Сохранить черновик', ['class' => 'btn btn-default btn-save', 'data-confirm' => 0, 'title' => 'Сохранить заявку в качестве черновика'])]);
     }
     // СУПЕР ХАК
     // если у нас вторым аргументом пришел "clone", то в силу вступает МАГИЯ...
     if (get_param($this->arguments, 1) === 'clone') {
         if ($ticket_status !== STATUS_OPEN) {
             $this->preparePopup('Продливать можно только открытую заявку');
             $this->redirect(['back' => 1]);
         } elseif (!$this->isGrantToMe('ACE_PROLONG', $tdepid)) {
             $this->preparePopup('Не достаточно прав для продления заявки', 'alert-warning');
             $this->redirect(['back' => 1]);
         }
         // по сути, мы открывем текущую заявку подменив ей статус на черновик,
         // что даст возможность редактирования ё параметров, но идентификатор заявки занулим,
         // что приведет к созданию новой заявки при сохранении
         $ticket_status = STATUS_DRAFT;
         $this->data['t_id'] = null;
         $this->data['t_message'] = sprintf("[Продление заявки #%s]\n%s", get_param($ticket, 'number'), get_param($ticket, 'message'));
         $this->data['button_delete'] = '';
         // кнопку удаления убираем
         $this->data['t_number'] = '-';
         $this->data['tstart'] = sqldate2human(get_param($ticket, 'dt_stop'));
         $this->data['tstop'] = '';
         $this->data['parent'] = $req_id;
         $this->data['t_department'] = get_param($deplist, $my_dep, '?');
         $this->data['buttons'] = '';
         // Удаляем забитые выше кнопки удаления и сохранения черновика. При клонировании они не нужны
     }
     $devices = '';
     // обходим перечень устройств указанных в заявке
     foreach ($devs as $item_id) {
         // получаем название из списка
         $devname = get_param($dlist, $item_id, '???');
         $this->data['mark'] = 1;
         $this->data['dev_name'] = $devname;
         $this->data['dev_id'] = $item_id;
         $this->data['dev_class'] = mb_strlen($devname) >= 35 ? 'col-md-12' : 'col-md-6';
         $devices .= $ticket_status === STATUS_DRAFT ? $this->renderPartial('device-item') : $devname . PHP_EOL;
     }
     if ($ticket_status !== STATUS_DRAFT) {
         $devices = nl2br($devices);
     }
     if (!count($dlist)) {
         $devices = $this->renderPartial('no-device');
     } elseif (!(count($devs) || $ticket_status === STATUS_DRAFT)) {
         $devices = "Устройства не указаны";
     }
     $review = get_param($ticket, 'review');
     /* AGREE FORM */
     if ($agree) {
         if ($ares === null) {
             //if ($my_role === Configuration::$ROLE_USER && $my_dep === $adepid) {
             if ($this->isGrantToMe('ACE_AGREE', $adepid)) {
                 $this->data['panel_content'] = $this->renderPartial('form-agree');
                 $this->scripts[] = 'agree-ticket';
             } else {
                 $this->data['panel_content'] = "<em>Ожидание решения руководителя цеха</em>";
             }
         } else {
             $this->data['ag_res'] = get_param($agree, 'result') ? 'Согласованно' : 'Отказанно';
             $this->data['ag_class'] = 'strong';
             $this->data['ag_user'] = makeSortName(get_param($agree, 'fullname', '-'));
             $this->data['ag_date'] = sqldate2human(get_param($agree, 'dt_stamp'));
             $this->data['panel_content'] = $this->renderPartial('agree-info');
         }
     } else {
         $this->data['panel_content'] = "<em>Не требуется</em>";
     }
     $this->data['panel_title'] = "Резолюция цеха {$adepname}";
     $this->data['resolutions'] .= $this->renderPartial('resolution-panel');
     /* AGREE FORM */
     /* REVIEW FORM */
     // форму рассмотрения нужно рисовать только в случае если согласование получено, либо оно не требуется вовсе
     if (!$agree || $ares !== null) {
         $this->data['panel_title'] = 'Резолюция главного инженера';
         if (!$review) {
             // Если результата согласования нет
             //if ($my_role === Configuration::$ROLE_ME) {
             if ($this->isGrantToMe('ACE_ACCEPT')) {
                 // Рисуем форму и подгружаем скрипт-обработчик
                 $this->data['panel_content'] = $this->renderPartial('form-review');
                 $this->scripts[] = 'review-ticket';
             } else {
                 $this->data['panel_content'] = "<em>Ожидание...</em>";
             }
         } else {
             // Покажем результат согласования ГИ
             $this->data['ag_class'] = '';
             $this->data['ag_res'] = get_param($review, 'result');
             $this->data['ag_user'] = get_param($review, 'fullname');
             $this->data['ag_date'] = sqldate2human(get_param($review, 'dt_stamp'));
             $reason = get_param($review, 'reason', null);
             $this->data['ag_reason'] = nl2br(html_entity_decode($reason)) ?: null;
             $this->data['panel_content'] = $this->renderPartial('review-info');
         }
         $this->data['resolutions'] .= $this->renderPartial('resolution-panel');
     }
     /* REVIEW FORM */
     //$this->scripts[] = 'debug-reload';
     if ($ticket_status >= STATUS_OPEN) {
         // Панелька исполнителей
         $history = $this->model->getTicketHistory($req_id, [STATUS_OPEN, STATUS_COMPLETE, STATUS_CLOSE]);
         $items = '';
         foreach ($history as $action) {
             $items .= CHtml::createTag('li', ['class' => 'list-group-item clearfix'], [CHtml::createTag('div', ['class' => 'col-xs-4 strong'], get_param($action, 'action')), CHtml::createTag('div', ['class' => 'col-xs-4'], makeSortName(get_param($action, 'fullname'))), CHtml::createTag('div', ['class' => 'col-xs-4'], sqldate2human(get_param($action, 'dt_stamp')))]);
         }
         $this->data['resolutions'] .= CHtml::createTag('ul', ['class' => 'list-group text-center'], $items);
     }
     // Пожарные
     $fire_person = $this->model->getFireDispatcher();
     // Список диспетчеров для выпадающиго списка
     $fire_column = array_column($fire_person, 'title', 'id');
     $dfire_o = get_param($ticket, 'fire_o') ?: -1;
     $dfire_c = get_param($ticket, 'fire_c') ?: -1;
     $this->data['fire_o'] = CHtml::createTag('input', ['class' => 'form-control', 'readonly' => true, 'type' => 'text', 'value' => get_param($fire_column, $dfire_o, '-')]);
     $this->data['fire_c'] = CHtml::createTag('input', ['class' => 'form-control', 'readonly' => true, 'type' => 'text', 'value' => get_param($fire_column, $dfire_c, '-')]);
     $this->data['navbtn'] = '';
     /**
      * Получим весь список заявок с таким же статусом, воспользовавшись моделью Списка
      * для того, чтобы сформировать кнопки "следующая" и "предыдущая"
      * для реализации очередной "хотелки"
      */
     if ($ticket_status < STATUS_ARCHIVE) {
         $cmod = new ContentsModel();
         $all = array_column($cmod->getTicketListByStatus($ticket_status, $my_dep), 'id');
         $idx = array_search($req_id, $all);
         $prev = get_param($all, $idx - 1);
         $next = get_param($all, $idx + 1);
         // Нашли предыдущую и слудующую, рисуем кнопки
         $this->data['navbtn'] = CHtml::createTag('div', ['class' => 'btn-group'], [CHtml::createTag('a', ['class' => 'btn btn-default strong' . ($prev ? '' : ' disabled'), 'href' => $prev ? $this->createActionUrl("edit/{$prev}") : '#'], [CHtml::createIcon('chevron-left'), 'Предыдущая']), CHtml::createButton(sprintf("%d из %d", $idx + 1, count($all)), ['class' => 'btn btn-default strong', 'disabled' => true, 'style' => 'color: #000']), CHtml::createTag('a', ['class' => 'btn btn-default strong' . ($next ? '' : ' disabled'), 'href' => $next ? $this->createActionUrl("edit/{$next}") : '#'], ['Следующая', CHtml::createIcon('chevron-right')])]);
     }
     $template = 'ticket-preview';
     switch ($ticket_status) {
         case STATUS_DRAFT:
             $template = 'new-ticket';
             $this->data['nodes'] = generateOptions($nodes, $nodeid, false);
             // дорисуем все устройства выбранного узла
             // которые не были отмеченны в заявке,
             // тчобы их можно было при необходимости выбрать
             foreach ($dlist as $key => $value) {
                 if (!in_array($key, $devs)) {
                     $this->data['mark'] = 0;
                     $this->data['dev_name'] = $value;
                     $this->data['dev_id'] = $key;
                     $this->data['dev_class'] = mb_strlen($value) >= 35 ? 'col-md-12' : 'col-md-6';
                     $devices .= $this->renderPartial('device-item');
                 }
             }
             $this->data['buttons'] .= CHtml::createButton('Отправить на согласование', ['class' => 'btn btn-primary btn-save', 'data-confirm' => 1]);
             $this->scripts[] = 'ticket-validate';
             break;
         case STATUS_AGREE:
             $this->data['title'] = 'Согласование заявки';
             /** todo: Проверить возможность текущего статуса
              * Возможно согласование уже получено, или вовсе не требуется.
              * Следовательно заявка находится в статусе согласования не может
              *  */
             if (!$adepid || $ares !== null) {
                 // Если id цеха, который должен согласовывать, не указан, или согласование уже получено (!= null)
                 // то статус у заявки неверный, и его желательно исправить
                 $this->preparePopup('Ошибочный статус заявки. Обратитесь в отдел АСУ.', 'alert-warning');
                 $template = 'incorrect-status';
                 // Я пока не уверен, что менять статус заяви автоматически - есть хорошо...
                 // $this->model->setTicketStatus($req_id, STATUS_REVIEW, 0);
             }
             // Если текущий пользователь - Руководитель, то добавим ему кнопку сохранения,
             // чтобы он мог увековечить результат своего согласования
             //if (($my_role === Configuration::$ROLE_USER && $my_dep === $adepid)	|| $my_role === Configuration::$ROLE_NSS) {
             if ($this->isGrantToMe('ACE_AGREE', $adepid)) {
                 $this->data['buttons'] = CHtml::createButton('Сохранить', ['class' => 'btn btn-primary', 'id' => 'save-btn']);
                 // Скрипт уже будет продгружен на этапе формирования формы
             }
             break;
         case STATUS_REVIEW:
             $this->data['title'] = 'Рассмотрение заявки';
             /** todo Проверить правильность текущего статуса
              * А именно: если должно быть согласование, то оно должно быть получено (result !== null)
              * Она не должна быть открытой или закрытой... Вобщем я хз как 100% быть уверенным
              */
             if ($agree && $ares === null) {
                 // Заявка должна быть согласована, но результата согласования нет
                 // соответственно в текущем статусе она быть не может
                 $this->preparePopup('Ошибочный статус заявки. Обратитесь в отдел АСУ.', 'alert-warning');
                 $template = 'incorrect-status';
                 //$this->model->setTicketStatus($req_id, $agree ? STATUS_AGREE : STATUS_DRAFT, 0);
             }
             //if ($my_role === Configuration::$ROLE_ME) {
             if ($this->isGrantToMe('ACE_ACCEPT')) {
                 $this->data['buttons'] = CHtml::createButton('Сохранить', ['class' => 'btn btn-primary', 'id' => 'save-btn']);
             }
             break;
         case STATUS_ACCEPT:
             $this->data['title'] = 'Обработка заявки';
             if (!$review) {
                 // Нет согласования главного инженера
                 $this->preparePopup('Ошибочный статус заявки. Обратитесь в отдел АСУ.', 'alert-warning');
                 $template = 'incorrect-status';
                 //$this->model->setTicketStatus($req_id, STATUS_ACCEPT, 0);
             }
             if ($this->isGrantToMe('ACE_DELETE')) {
                 $this->data['buttons'] .= CHtml::createButton('Удалить заявку', ['class' => 'btn btn-danger', 'id' => 'delete-btn', 'data-toggle' => 'modal', 'data-target' => '#popup-dialog', 'href' => "/ticket/inputreason/{$req_id}/"]);
                 //$this->scripts[] = 'delete-ticket';
             }
             //if ($my_role === Configuration::$ROLE_NSS) {
             if ($this->isGrantToMe('ACE_OPEN')) {
                 $this->data['fire_o'] = CHtml::createTag('select', ['class' => 'selectpicker show-tick form-control', 'data-style' => 'btn-default strong'], generateOptions($fire_person, null, 'Не требуется'));
                 $this->data['buttons'] .= CHtml::createLink('Открыть заявку', "/ticket/start/{$req_id}/", ['class' => 'btn btn-primary', 'data-fire' => '', 'id' => 'action-btn']);
                 $this->scripts[] = 'fire-select';
             }
             break;
         case STATUS_OPEN:
             $this->data['title'] = 'Прикрытие заявки';
             //if ($my_role === Configuration::$ROLE_USER && $my_dep === $tdepid) {
             if ($this->isGrantToMe('ACE_COMPLETE', $tdepid)) {
                 $this->data['buttons'] = CHtml::createTag('div', ['class' => 'btn-group'], [CHtml::createLink('Продлить заявку', 'clone/', ['class' => 'btn btn-default']), CHtml::createButton('Прикрыть заявку', ['id' => 'btn-close', 'class' => 'btn btn-primary'])]);
                 $this->scripts[] = 'handle-open';
             }
             break;
         case STATUS_COMPLETE:
             $this->data['title'] = 'Закрытие заявки';
             // Добавим панельку с информацией о том, кто открыл заявку
             //if ($my_role === Configuration::$ROLE_NSS) {
             if ($this->isGrantToMe("ACE_CLOSE")) {
                 $this->data['fire_c'] = CHtml::createTag('select', ['class' => 'selectpicker show-tick form-control', 'data-style' => 'btn-default strong'], generateOptions($fire_person, null, 'Не требуется'));
                 $this->data['buttons'] = CHtml::createLink('Закрыть заявку', "/ticket/close/{$req_id}/", ['class' => 'btn btn-primary strong', 'data-fire' => '', 'id' => 'action-btn']);
                 $this->scripts[] = 'fire-select';
             }
             break;
         case STATUS_REJECT:
         case STATUS_CLOSE:
         case STATUS_ARCHIVE:
         case STATUS_DELETE:
             $template = 'ticket-preview-history';
             $this->data['title'] = 'Просмотр заявки';
             $this->data['fire_o'] = get_param($fire_column, $dfire_o, '-');
             $this->data['fire_c'] = get_param($fire_column, $dfire_c, '-');
             // Для статуса ОТКЛОНЕНА/РАЗРЕШЕНА найдем причину/условие либо в согласовании, либо в разрешении
             $reason = get_param($agree, 'reason', null);
             $reason = get_param($review, 'reason', $reason);
             //nl2br(html_entity_decode( X )) ??? [для краясвкости]
             $this->data['history'] = '';
             $log = $this->model->getTicketHistory($req_id);
             foreach ($log as $action) {
                 $this->data['history'] .= CHtml::createTag('li', ['class' => 'list-group-item clearfix'], [CHtml::createTag('div', ['class' => 'col-xs-12 strong text-center'], get_param($action, 'action')), CHtml::createTag('div', ['class' => 'col-xs-6'], makeSortName(get_param($action, 'fullname'))), CHtml::createTag('em', ['class' => 'col-xs-6 text-right text-muted'], sqldate2human(get_param($action, 'dt_stamp'))), get_param($action, 'status_id') == STATUS_REJECT ? CHtml::createTag('div', ['class' => 'text-danger strong'], [$reason ? CHtml::createTag('div', ['class' => 'col-xs-4'], 'Причина:') : '', CHtml::createTag('em', ['class' => 'col-xs-8 text-right'], $reason)]) : '', get_param($action, 'status_id') == STATUS_ACCEPT ? CHtml::createTag('em', ['class' => 'text-success strong text-right col-xs-12'], $reason) : '', get_param($action, 'status_id') == STATUS_DELETE ? CHtml::createTag('em', ['class' => 'text-danger strong text-right col-xs-12'], get_param($ticket, 'extra')) : '']);
             }
             break;
         default:
             $template = 'incorrect-status';
     }
     if ($ticket_status >= STATUS_ACCEPT) {
         $this->data['resolutions'] .= $this->renderPartial('fire-panel');
     }
     $this->data['devlist'] = $devices;
     $this->render($template);
 }
コード例 #2
0
    public function actionIndex()
    {
        $this->render('', false);
        $stmt = $this->mdb->prepare('
		select * from vivod
		where delete = 0
			and DataPodashi >= :ds
		order by 2 desc');
        $stmt->execute(['ds' => '2016-01-01']);
        //and NomerZaiavki in (11677,11653)
        $list = $this->prepareData($stmt);
        $tdev = $this->mdb->prepare('select * from RemontMehanizmov where NomerZaiavki = :tnum');
        //$list = array_slice($list, 0, 13);
        //var_dump($list);
        $tmod = new TicketModel();
        $nlist = array_column($tmod->getNodes(), 'id', 'title');
        $nlist['аккумуляторные батареи'] = 1;
        // Исключение (pretty view)
        $dlist = array_column($tmod->getDepartments(), 'id', 'title');
        $dlist['Электроцех'] = $dlist['ЭЦ'];
        // Теперь это просто ЭЦ
        $dlist['ЦСДТУ'] = $dlist['СДТУ'];
        // Теперь это ...
        $dlist['ОИТ'] = $dlist['ОАСУ'];
        // Теперь это ...
        //var_dump($dlist);
        $fire_d = array_column($tmod->getFireDispatcher(), 'id', 'title');
        //var_dump($fire_d);
        $user_cache = [];
        $user_cache['Ернмеев С.Н.'] = '80000075';
        // Исключение (опечатка)
        $user_cache['Еремеев С.Н.'] = '80000075';
        // Исключение (два человека)
        $user_cache['Кальнер Б.В.'] = '80000791';
        // Мой косяк (превращаем в Боровика)
        $results = ['Отказать' => 3, 'Разрешить' => 1, 'Разрешить при условии' => 2];
        $dev_cache = [];
        // кэш устройств чтобы постоянно не лазить в базу
        foreach ($list as $ticket) {
            $info = [];
            $ticket_id = get_param($ticket, 'NomerZaiavki');
            $info['ticket_id'] = $info['t_number'] = $ticket_id;
            $info['depid'] = get_param($dlist, get_param($ticket, 'ZECH', 0));
            // Дата создания
            $date = explode(' ', join(' ', get_array_part($ticket, 'DataPodashi TimePodashi')));
            $info['t_cdate'] = join(' ', get_array_part($date, [0, 3]));
            if (empty(get_param($ticket, 'TimePodashi'))) {
                continue;
            }
            // Дата начала
            $date = explode(' ', join(' ', get_array_part($ticket, 'Data_Zayavki1 Times_Zayavki1')));
            $info['td_start'] = sqldate2human(join(' ', get_array_part($date, [0, 3])));
            // Дата конца
            $date = explode(' ', join(' ', get_array_part($ticket, 'Data_Zayavki2 Times_Zayavki2')));
            $info['td_stop'] = sqldate2human(join(' ', get_array_part($date, [0, 3])));
            $creator = trim(get_param($ticket, 'FamilijaPod'));
            if (empty($creator)) {
                continue;
            }
            $info['user'] = get_param($user_cache, $creator) ?: $tmod->findPersonByName($creator);
            $user_cache[$creator] = $info['user'];
            $info['t_message'] = get_param($ticket, 'ZAIABKA') ?: 'Нечего сказать...';
            $info['t_node'] = get_param($nlist, get_param($ticket, 'Oborudovanie'), -1);
            if ($info['t_node'] === -1) {
                var_dump(get_array_part($ticket, 'NomerZaiavki Oborudovanie'));
            }
            $this->model->clearTicketLog($ticket_id);
            // Удаляем лог
            //$tmod->setTicketStatus($ticket_id, STATUS_CLOSE, $info['user']);
            //$tmod->setTicketStatus($ticket_id, STATUS_DRAFT, $info['user']);
            // ремонтируемые устройства
            $node_id = $info['t_node'];
            $tdev->execute(['tnum' => $ticket_id]);
            $devices = array_column($this->prepareData($tdev), 'MEHANIZM');
            if (count($devices)) {
                // Получаем список устройств указанного узла,
                // и пытаемся сопоставить по имени
                // выполнив некоторые преобразования (pretty | trim ucfirst)
                $bdev = get_param($dev_cache, $node_id) ?: array_column($tmod->getDevices($node_id), 'id', 'name');
                $dev_cache[$node_id] = $bdev;
                foreach ($devices as $cdev) {
                    $did = get_param($bdev, mb_capitalize($cdev));
                    if ($did) {
                        $info['devices'][] = $did;
                    }
                }
                if (count($devices) != count($info['devices'])) {
                    var_dump("!!! " . $ticket_id . " !!!", $devices, $node_id, $bdev);
                }
            }
            $info['status'] = STATUS_DRAFT;
            // Согласование цеха
            $adep = get_param($ticket, 'SoglasZech', -1);
            $agree = [];
            if ($adep !== null) {
                $agree['id'] = $ticket_id;
                $agree['depid'] = get_param($dlist, $adep, null);
                $info['status'] = STATUS_AGREE;
                switch (get_param($ticket, 'Soglasie')) {
                    case 'согласовано':
                        $agree['result'] = 1;
                        $info['status'] = STATUS_REVIEW;
                        break;
                    case 'не согласовано':
                        $agree['result'] = 0;
                        $info['status'] = STATUS_REJECT;
                        break;
                    default:
                        $agree['result'] = null;
                        //Ждем согласования
                }
                $agree['user'] = null;
                if (is_int($agree['result'])) {
                    $auser = get_param($ticket, 'SoglasFamilia', -1);
                    $agree['user'] = get_param($user_cache, $auser) ?: $tmod->findPersonByName($auser);
                    $user_cache[$auser] = $agree['user'];
                }
                $info['agreement'] = $agree['depid'];
                //var_dump($agree);
            }
            // @todo Тут как бы по хорошему надо сохранить заявку
            $tmod->saveTicket($info);
            $tmod->setTicketStatus($ticket_id, STATUS_DRAFT, $info['user'], $info['t_cdate']);
            if ($adep !== null) {
                $tmod->setAgreement($ticket_id, $agree['depid'], $agree['user'], $agree['result'], null);
                $tmod->setTicketStatus($ticket_id, $info['status'], $agree['user'], $info['t_cdate']);
            } else {
                $tmod->setTicketStatus($ticket_id, STATUS_REVIEW, $info['user'], $info['t_cdate']);
            }
            // Разрешение главным инженером
            $r_result = get_param($ticket, 'Razreshenie');
            if ($r_result !== null) {
                $resolution = [];
                $resolution['id'] = $ticket_id;
                $resolution['result'] = $results[$r_result];
                $resolution['reason'] = get_param($ticket, 'Pozit', null);
                $engineer = get_param($ticket, 'Familia2');
                $resolution['user'] = get_param($user_cache, $engineer) ?: $tmod->findPersonByName($engineer);
                $user_cache[$engineer] = $resolution['user'];
                $info['status'] = $resolution['result'] === 3 ? STATUS_REJECT : STATUS_ACCEPT;
                $tmod->setConfirmation($ticket_id, $resolution['user'], $resolution['result'], $resolution['reason']);
                $tmod->setTicketStatus($ticket_id, $info['status'], $resolution['user'], $info['t_cdate']);
                //var_dump($resolution,$r_result);
            }
            // Открытие заявки
            $dopen = get_param($ticket, 'DataVivoda');
            if ($dopen) {
                $ouser = get_param($ticket, 'Familia');
                $person = get_param($user_cache, $ouser) ?: $tmod->findPersonByName($ouser);
                $user_cache[$ouser] = $person;
                $fid = get_param($fire_d, get_param($ticket, 'Dispetcher_O') ?: -1, null);
                $this->model->openTicket($ticket_id, $dopen, $fid);
                $tmod->setTicketStatus($ticket_id, STATUS_OPEN, $person, $dopen);
            }
            // Прикрытие заявки
            $dcomplete = get_param($ticket, 'DataZakritija');
            if ($dcomplete) {
                $ouser = get_param($ticket, 'FamiliaZakr');
                $person = get_param($user_cache, $ouser) ?: $tmod->findPersonByName($ouser);
                $user_cache[$ouser] = $person;
                $this->model->completeTicket($ticket_id, $dcomplete);
                $tmod->setTicketStatus($ticket_id, STATUS_COMPLETE, $person, $dcomplete);
            }
            // Закрытие заявки
            $dclose = get_param($ticket, 'TimesVvoda');
            if ($dclose) {
                $ouser = get_param($ticket, 'FamiliaVvod');
                $person = get_param($user_cache, $ouser) ?: $tmod->findPersonByName($ouser);
                $user_cache[$ouser] = $person;
                $fid = get_param($fire_d, get_param($ticket, 'Dispetcher_V') ?: -1, null);
                $this->model->closeTicket($ticket_id, $dclose, $fid);
                $tmod->setTicketStatus($ticket_id, STATUS_CLOSE, $person, $dclose);
            }
            //var_dump($info);
            //$tmod->setTicketStatus($ticket_id, STATUS_CLOSE, -1);
        }
        //var_dump($dev_cache);
        var_dump($user_cache);
        if (count($this->qerrors)) {
            var_dump($this->qerrors);
        }
        $this->render('');
    }