<?php

namespace app\modules\performance\controllers;

use Yii;
use app\modules\performance\models\Vertical;
use app\modules\performance\models\VerticalSearch;
use app\modules\performance\models\VerticalAgrupador;
use app\controllers\BaseController;
use yii\web\NotFoundHttpException;
use yii\web\HttpException;
use yii\filters\VerbFilter;
use yii\helpers\ArrayHelper;
use app\modules\performance\models\VerticalAuditoriaSearch;
use app\modules\performance\models\VerticalAuditoria;
use app\modules\performance\models\Psaarea;
use app\modules\performance\models\VerticalEstrutura;
use app\modules\performance\models\Psacampo;
use app\modules\performance\models\VerticalIndicador;
use app\modules\performance\models\PsacampoItem;
use app\modules\performance\models\VerticalAlternativa;
use app\component\Utils;
use yii\web\Response;
use yii\bootstrap\ActiveForm;
use yii\helpers\Json;
use app\modules\performance\models\Projeto;
use app\modules\performance\models\ColetaEstrutura;
use app\modules\performance\models\VerticalIndicadorTemParametro;
use app\modules\performance\models\VerticalIndicadorParametro;

/**
 * VerticalController implements the CRUD actions for Vertical model.
 */
class VerticalController extends BaseController {

    /**
     * {@inheritdoc}
     */
    public function behaviors() {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all Vertical models.
     * @return mixed
     */
    public function actionIndex() {
        \app\models\Base::loga("Acessou a lista de Verticais", $_GET, $_POST);

        $searchModel = new VerticalSearch();

        if (!$searchModel->status) {
            $searchModel->status = Vertical::ATIVO;
        }

        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        $agrupadores = ArrayHelper::map(VerticalAgrupador::find()->where(['status' => Vertical::ATIVO])->orderBy('nome ASC')->all(), 'id', 'nome');

        $periodos = [Vertical::PERIODO_UNICO => 'Não periódico', Vertical::PERIODO_MENSAL => 'Mensal', Vertical::PERIODO_DIARIO => 'Diária', Vertical::PERIODO_INDEFINIDO => 'Indefinido',];

        return $this->render('index', [
                    'searchModel' => $searchModel,
                    'dataProvider' => $dataProvider,
                    'agrupadores' => $agrupadores,
                    'periodos' => $periodos,
        ]);
    }

    /**
     * Displays a single Vertical model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id) {
        \app\models\Base::loga("Acessou os dados da Vertical", $_GET, $_POST);

        $model = $this->findModel($id);

        $periodos = [Vertical::PERIODO_UNICO => 'Não periódico', Vertical::PERIODO_MENSAL => 'Mensal', Vertical::PERIODO_DIARIO => 'Diária', Vertical::PERIODO_INDEFINIDO => 'Indefinido',];

        $estrutura = Vertical::estrutura($model);

        $validaTaxaSubstituicao = '';

        foreach ($model->getVerticalEstruturas()->where(['status' => VerticalEstrutura::ATIVO])->all() as $item) {
            $validaTaxaSubstituicao = Vertical::validaSomaTaxaSubstiuicao($item);
            if (!empty($validaTaxaSubstituicao)) {
                //Yii::$app->session->setFlash('danger', 'Atenção! Existem problemas nas Taxas de Substituição.');
                break;
            }
        }

//Utils::debug($estrutura);
        return $this->render('view', [
                    'model' => $model,
                    'periodos' => $periodos,
                    'estrutura' => $estrutura,
                    'validaTaxaSubstituicao' => $validaTaxaSubstituicao,
        ]);
    }

    /**
     * Creates a new Vertical model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate() {
        \app\models\Base::loga("Acessou a criação da Vertical", $_GET, $_POST);

        $model = new Vertical();

        $model->tipo = Vertical::TIPO_PADRAO;

        $model->created_at = date('Y-m-d H:i:s');

        $model->created_by = Yii::$app->user->identity->id ?? null;

        if ($model->load(Yii::$app->request->post())) {

            $valid = true;

            $connection = \Yii::$app->db;

            $transaction = $connection->beginTransaction();
            try {

                if (!$model->save()) {
                    $valid = false;
                    //\Yii::$app->session->setFlash('error', "ECV1 - Erro ao salvar a vertical, motivo: " . json_encode($model->getErrors()));
                    Yii::$app->getSession()->setFlash('error', [
                        'type' => 'error',
                        'duration' => 500000,
                        'icon' => 'fa fa-warning',
                        'message' => "ECV1 - Erro ao salvar a vertical, motivo: " . json_encode($model->getErrors()),
                        'title' => 'Atenção!!',
                        'positonY' => 'bottom',
                        'positonX' => 'right',
                    ]);
                }

                if ($valid) {

                    $vertice = new VerticalEstrutura();
                    $vertice->nome = 'Segurança';
                    $vertice->tipo_estrutura = 'V';
                    $vertice->vertical_id = $model->id;
                    $vertice->status = VerticalEstrutura::ATIVO;
                    $vertice->created_by = Yii::$app->user->identity->id ?? null;
                    $vertice->created_at = date('Y-m-d H:i:s');

                    if (!$vertice->save()) {
                        $valid = false;
                        //\Yii::$app->session->setFlash('error', "ECV2 - Erro ao salvar o vértice da vertical, motivo: " . json_encode($vertice->getErrors()));
                        Yii::$app->getSession()->setFlash('error', [
                            'type' => 'error',
                            'duration' => 500000,
                            'icon' => 'fa fa-warning',
                            'message' => "ECV2 - Erro ao salvar o vértice, motivo: " . json_encode($model->getErrors()),
                            'title' => 'Atenção!!',
                            'positonY' => 'bottom',
                            'positonX' => 'right',
                        ]);
                    }
                }

                if ($valid) {

                    $transaction->commit();

                    return $this->redirect(['view', 'id' => $model->id]);
                } else {

                    $transaction->rollback();
                }
            } catch (Exception $e) {
                $transaction->rollback();
            }
        }

        $agrupadores = ArrayHelper::map(VerticalAgrupador::find()->where(['status' => Vertical::ATIVO])->orderBy('nome ASC')->all(), 'id', 'nome');

        $periodos = [Vertical::PERIODO_UNICO => 'Não periódico', Vertical::PERIODO_MENSAL => 'Mensal', Vertical::PERIODO_DIARIO => 'Diária', Vertical::PERIODO_INDEFINIDO => 'Indefinido',];

        $interpolacoes = [Vertical::INTERPOLACAO_SIM => 'Com interpolação', Vertical::INTERPOLACAO_NAO => 'Sem interpolação',];

        return $this->render('create', [
                    'model' => $model,
                    'agrupadores' => $agrupadores,
                    'periodos' => $periodos,
                    'interpolacoes' => $interpolacoes,
        ]);
    }

    /**
     * Updates an existing Vertical model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionUpdate($id) {
        \app\models\Base::loga("Acessou a atualização da Vertical", $_GET, $_POST);

        $model = $this->findModel($id);

        $model->updated_at = date('Y-m-d H:i:s');

        $model->created_by = Yii::$app->user->identity->id ?? null;

        if ($model->load(Yii::$app->request->post()) && $model->save()) {

            Yii::$app->getSession()->setFlash('success', [
                'type' => 'success',
                'duration' => 5000,
                'icon' => 'fa fa-chek',
                'message' => 'Vertical atualizada com sucesso!',
                'title' => 'Sucesso!',
                'positonY' => 'bottom',
                'positonX' => 'right',
            ]);

            return $this->redirect(['view', 'id' => $model->id]);
        }

        $agrupadores = ArrayHelper::map(VerticalAgrupador::find()->where(['status' => Vertical::ATIVO])->orderBy('nome ASC')->all(), 'id', 'nome');

        $periodos = [Vertical::PERIODO_UNICO => 'Não periódico', Vertical::PERIODO_MENSAL => 'Mensal', Vertical::PERIODO_DIARIO => 'Diária', Vertical::PERIODO_INDEFINIDO => 'Indefinido',];

        $interpolacoes = [Vertical::INTERPOLACAO_SIM => 'Com interpolação', Vertical::INTERPOLACAO_NAO => 'Sem interpolação',];

        return $this->render('update', [
                    'model' => $model,
                    'agrupadores' => $agrupadores,
                    'periodos' => $periodos,
                    'interpolacoes' => $interpolacoes,
        ]);
    }

    /**
     * Deletes an existing Vertical model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionDelete($id) {
        \app\models\Base::loga("Acessou a exclusão da Vertical", $_GET, $_POST);

        $model = $this->findModel($id);

        $model->status = Vertical::INATIVO;

        if (!$model->save()) {

//            $msgErro = '<ul>';
//            foreach ($model->getErrors() as $key => $value) {
//                $msgErro .= '<li>' . $key . ': ' . $value . '</li>';
//            }
//            $msgErro .= '</ul>';
            throw new HttpException(500, "Erro ao excluir a Vertical, motivo: " . json_encode($model->getErrors()));
        }

        return $this->redirect(['index']);
    }

    /**
     * Finds the Vertical model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Vertical the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id) {
        if (($model = Vertical::findOne($id)) !== null) {
            return $model;
        }

        throw new NotFoundHttpException('The requested page does not exist.');
    }

    public function actionImportarBackoffice() {

        \app\models\Base::loga("Acessou a importação de Verticais do BackOffice", $_GET, $_POST);

        $searchModel = new VerticalAuditoriaSearch();

        $searchModel->ATV_VERTICAL_AUDITORIA = VerticalAuditoriaSearch::ATIVO;

        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        if (Yii::$app->request->get()) {
            if (isset($_GET['id'])) {


                $valid = true;

                $connection = \Yii::$app->db;

                $transaction = $connection->beginTransaction();

                try {

                    $base = VerticalAuditoria::find()->where(['COD_VERTICAL_AUDITORIA' => $_GET['id'], 'ATV_VERTICAL_AUDITORIA' => VerticalAuditoria::ATIVO])->one();

                    if (!$base) {
                        $valid = false;
                        throw new HttpException(500, "Vertical base não encontrada");
                    }

                    if ($valid) {
                        $psaareaBase = Psaarea::find()
                                ->where([
                                    'COD_VERTICAL_AUDITORIA' => $_GET['id'],
                                    'NOME_PSAAREA' => 'Segurança',
                                    'TIPO_AREA' => 'V',
                                    'ATV_PSAAREA' => 1
                                ])
                                ->one();
                    }

                    if (!$psaareaBase) {
                        $valid = false;
                        throw new HttpException(500, "Psaarea base não encontrada");
                    }


                    if ($valid) {

                        $listaAreas = [];
                        $listaAreas[] = $psaareaBase->cod_psaarea;

                        $psaareas = Psaarea::find()
                                ->select('cod_psaarea, NOME_PSAAREA')
                                ->where(['COD_AREA_PAI' => $psaareaBase->cod_psaarea, 'ATV_PSAAREA' => 1])
                                ->asArray()
                                ->all();

                        foreach ($psaareas as $psaarea) {
                            $listaAreas[] = $psaarea['cod_psaarea'];
                        }

                        for ($i = 0; $i <= 10; $i++) {
                            $psaareas = Psaarea::find()
                                    ->select('cod_psaarea')
                                    ->where(['ATV_PSAAREA' => 1])
                                    ->andWhere(['in', 'COD_AREA_PAI', $listaAreas])
                                    ->asArray()
                                    ->all();

                            foreach ($psaareas as $psaarea) {
                                $listaAreas[] = $psaarea['cod_psaarea'];
                            }
                        }


                        $psaareas = Psaarea::find()
                                ->select('psaarea.*, psaarea_item.TAXA_SUBSTITUICAO')
                                ->join('left join', 'psaarea_item', 'psaarea.cod_psaarea = psaarea_item.cod_psaarea')
                                ->where(['ATV_PSAAREA' => 1])
                                ->andWhere(['or',
                                    ['=', 'psaarea.cod_psaarea', $psaareaBase->cod_psaarea],
                                    ['in', 'COD_AREA_PAI', $listaAreas],
                                ])
                                ->orderBy('psaarea.cod_psaarea ASC')
                                ->asArray()
                                ->all();
//Utils::debug([$listaAreas, $psaareas]);
                        if (!$psaareas) {
                            $valid = false;
                            throw new HttpException(500, "Estrutura base não encontrada");
                        }
                    }

//Utils::debug($psaareas);
                    if ($valid) {
                        $verticalExiste = Vertical::find()->where(['cod_backoffice' => $_GET['id'], 'status' => Vertical::ATIVO])->one();
                        if ($verticalExiste) {
                            $verticalExiste->status = Vertical::INATIVO;
                            $verticalExiste->updated_at = date('Y-m-d- H:i:s');

                            if (!$verticalExiste->save()) {
                                $valid = false;
                                throw new HttpException(500, "Erro ao excluir a vertical existente, motivo: " . json_encode($verticalExiste->getErrors()));
                            }

                            if ($valid) {
                                $verticalExisteEstruturas = VerticalEstrutura::find()->where(['vertical_id' => $verticalExiste->id, 'status' => VerticalEstrutura::ATIVO])->all();

                                $listaEstruturaExiste = [];
                                foreach ($verticalExisteEstruturas as $verticalExisteEstrutura) {

                                    $listaEstruturaExiste[] = $verticalExisteEstrutura->id;

                                    if ($valid) {
                                        $verticalExisteEstrutura->status = VerticalEstrutura::INATIVO;
                                        $verticalExisteEstrutura->updated_at = date('Y-m-d- H:i:s');

                                        if (!$verticalExisteEstrutura->save()) {
                                            $valid = false;
                                            throw new HttpException(500, "Erro ao excluir a estrutura da vertical existente, motivo: " . json_encode($verticalExisteEstrutura->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {

                                $indicadoresExiste = VerticalIndicador::find()->andWhere(['in', 'estrutura_id', $listaEstruturaExiste])->all();

                                $listaIndicadorExiste = [];

                                foreach ($indicadoresExiste as $indicadorExiste) {

                                    $listaIndicadorExiste[] = $indicadorExiste->id;

                                    if ($valid) {
                                        $indicadorExiste->status = VerticalIndicador::INATIVO;
                                        $indicadorExiste->updated_at = date('Y-m-d- H:i:s');
                                        $indicadorExiste->usa_interpolacao = 0;

                                        if (!$indicadorExiste->save()) {
                                            $valid = false;
                                            throw new HttpException(500, "Erro ao excluir o indicador da vertical existente, motivo: " . json_encode($indicadorExiste->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {

                                $alternativasExiste = VerticalAlternativa::find()->andWhere(['in', 'indicador_id', $listaIndicadorExiste])->all();

                                foreach ($alternativasExiste as $alternativaExiste) {
                                    if ($valid) {
                                        $alternativaExiste->status = VerticalAlternativa::INATIVO;
                                        $alternativaExiste->updated_at = date('Y-m-d- H:i:s');

                                        if (!$alternativaExiste->save()) {
                                            $valid = false;
                                            throw new HttpException(500, "Erro ao excluir o a alternativa indicador da vertical existente, motivo: " . json_encode($alternativaExiste->getErrors()));
                                        }
                                    }
                                }
                            }
                        }
                    }


                    $vertical = new Vertical();
                    $vertical->nome = $base->NOME_VERTICAL_AUDITORIA;
                    $vertical->descricao = $base->DESCRICAO_VERTICAL_AUDITORIA;
                    $vertical->observacao = mb_convert_encoding((string) $base->OBSERVACOES, 'UTF-8', 'ISO-8859-1');
                    $vertical->status = Vertical::ATIVO;
                    $vertical->created_by = \Yii::$app->user->identity->id ?? null;
                    $vertical->created_at = date('Y-m-d H:i:s');
                    $vertical->tipo = $base->COD_TIPO_VERTICAL_AUDITORIA;
                    $vertical->regra = $base->cod_regra_vertical;
                    $vertical->origem_dados = $base->COD_TIPO_ORIGEM_DADOS;
                    $vertical->cod_backoffice = $base->COD_VERTICAL_AUDITORIA;

                    if (!$vertical->save()) {
                        $valid = false;
                        throw new \yii\web\HttpException(500, "Erro ao importar a vertical, motivo: " . json_encode($vertical->getErrors()));
                    }

                    if ($valid) {

                        $listaPsaarea = [];
                        $nivelPsaarea = [];

                        foreach ($psaareas as $area) {
                            if ($valid) {

                                $listaPsaarea[] = $area['cod_psaarea'];

                                if (isset($nivelPsaarea[$area['COD_AREA_PAI']])) {
                                    $nivel = $nivelPsaarea[$area['COD_AREA_PAI']] + 1;
                                } else {
                                    $nivel = 0;
                                }

                                $estrutura = new VerticalEstrutura();
                                $estrutura->nome = $area['NOME_PSAAREA'];
                                $estrutura->cod_pai = $area['COD_AREA_PAI'];
                                $estrutura->ordem = $area['ORDEM'];
                                $estrutura->tipo_estrutura = $area['TIPO_AREA'];
                                $estrutura->nome_reduzido = $area['NOME_AREA_REDUZIDO'];
                                $estrutura->vertical_id = $vertical->id;
                                $estrutura->taxa_substituicao = $area['TAXA_SUBSTITUICAO'];
                                $estrutura->status = VerticalEstrutura::ATIVO;
                                $estrutura->cod_temp = $area['cod_psaarea'];
                                $estrutura->nivel = $nivel;
                                $estrutura->created_by = \Yii::$app->user->identity->id ?? null;
                                $estrutura->created_at = date('Y-m-d H:i:s');

                                if (!$estrutura->save()) {
                                    $valid = false;
                                    throw new \yii\web\HttpException(500, "Erro ao importar a estrutura da  vertical, motivo: " . json_encode($estrutura->getErrors()));
                                }

                                $nivelPsaarea[$area['cod_psaarea']] = $nivel;
                            }
                        }
                    }

                    if ($valid) {
//Utils::debug($listaPsaarea);
                        $psacampos = Psacampo::find()
                                ->where(['ATV_PSACAMPO' => Psacampo::ATIVO])
                                ->andWhere(['in', 'COD_PAI', $listaPsaarea])
                                ->orderBy('cod_psacampo ASC')
                                ->all();

                        if (!$psacampos) {
                            $valid = false;
                            throw new HttpException(500, "Não foram encontrados psacampos (indicadores) da vertical base");
                        }
                    }

                    if ($valid) {

                        $listaPsacampo = [];

                        foreach ($psacampos as $psacampo) {

                            if ($valid) {

                                if ($psacampo->TIPO_CAMPO == VerticalIndicador::TIPO_LISTA) {
                                    $listaPsacampo[] = $psacampo->cod_psacampo;
                                }

                                $indicador = new VerticalIndicador();
                                $indicador->nome = $psacampo->NOME_PSACAMPO;
                                $indicador->estrutura_id = $psacampo->COD_PAI;
                                $indicador->tipo = $psacampo->TIPO_CAMPO;
                                $indicador->taxa_substituicao = $psacampo->TAXA_SUBSTITUICAO;
                                $indicador->obrigatorio = $psacampo->OBRIGATORIO;
                                $indicador->status = $psacampo->ATV_PSACAMPO;
                                $indicador->created_by = \Yii::$app->user->identity->id ?? null;
                                $indicador->created_at = date('Y-m-d H:i:s');
                                $indicador->cod_temp = $psacampo->cod_psacampo;
                                $indicador->usa_interpolacao = 0;

                                if (!$indicador->save()) {
                                    $valid = false;
                                    throw new \yii\web\HttpException(500, "Erro ao importar os indicadores da  vertical, motivo: " . json_encode($indicador->getErrors()));
                                }
                            }
                        }
                    }

                    if ($valid) {

                        $psacampositens = PsacampoItem::find()->where(['ATV_PSACAMPO_ITEM' => PsacampoItem::ATIVO])->andWhere(['in', 'COD_PSACAMPO', $listaPsacampo])->all();

                        if (!$psacampositens) {
                            $valid = false;
                            throw new HttpException(500, "Não foram encontrados alternativas dos indicadores da vertical base");
                        }
                    }

                    if ($valid) {

                        foreach ($psacampositens as $psacampositem) {

                            if ($valid) {

                                $alternativa = new VerticalAlternativa();
                                $alternativa->nome = $psacampositem->NOME_PSACAMPO_ITEM;
                                $alternativa->indicador_id = $psacampositem->COD_PSACAMPO;
                                $alternativa->peso = $psacampositem->PESO;
                                $alternativa->ordem = $psacampositem->ordem;
                                $alternativa->nivel_esforco = $psacampositem->NIVEL_DE_ESFORCO;
                                $alternativa->nivel_referencia = $psacampositem->NIVEL_DE_REFERENCIA;
                                $alternativa->nivel_referencia_bn = $psacampositem->NIVEL_DE_REFERENCIA_BN;
                                $alternativa->status = $psacampositem->ATV_PSACAMPO_ITEM;
                                $alternativa->created_by = \Yii::$app->user->identity->id ?? null;
                                $alternativa->created_at = date('Y-m-d H:i:s');
                                $alternativa->cod_temp = $psacampositem->cod_psacampo_item;

                                if (!$alternativa->save()) {
                                    $valid = false;
                                    throw new \yii\web\HttpException(500, "Erro ao importar os indicadores da  vertical, motivo: " . json_encode($alternativa->getErrors()));
                                }
                            }
                        }
                    }

                    if ($valid) {
                        $valid = VerticalEstrutura::corrigiPaiTaxa($vertical->id);
                    }

                    if ($valid) {
                        $valid = VerticalIndicador::corrigiPai($vertical->id);
                    }

                    if ($valid) {
                        $valid = VerticalAlternativa::corrigiPai($vertical->id);
                    }


                    $transaction->commit();

                    return $this->redirect(['view', 'id' => $vertical->id]);
                } catch (Exception $e) {
                    $transaction->rollback();
                    throw new \yii\web\HttpException(500, "Erro ao importar a vertical, motivo: " . $e->getMessage());
                }
            }
        }


        return $this->render('importar-backoffice', [
                    'searchModel' => $searchModel,
                    'dataProvider' => $dataProvider,
        ]);
    }

    public function actionResponse($vertical_id) {

        \app\models\Base::loga("Acessou o response de Verticais", $_GET, $_POST);


        if (isset($_GET['operation'])) {
            try {
                $result = null;
                switch ($_GET['operation']) {
                    case 'get_node':
                        $node = isset($_GET['id']) && $_GET['id'] !== '#' ? (int) $_GET['id'] : 0;
//$sql = "SELECT * FROM `vertical_estrutura where vertical_id='$vertical_id'` ";
//$res = mysqli_query($conn, $sql) or die("database error:" . mysqli_error($conn));
                        $data = VerticalEstrutura::find()
                                ->select('id, nome as text, cod_pai as parent_id, cod_pai as cod_pai')
                                ->where(['vertical_id' => $vertical_id, 'status' => VerticalEstrutura::ATIVO])
//                                ->andWhere(['or',
//                                        ['!=', 'cod_pai', 0],
//                                        ['=', 'tipo_estrutura', 'V'],
//                                ])          
                                ->orderBy('ordem ASC, id ASC')
                                ->asArray()
                                ->all();
//iterate on results row and create new index array of data
//while ($row = mysqli_fetch_assoc($res)) {
//    $data[] = $row;
//}
//Utils::debug($data);
                        $itemsByReference = array();

// Build array of item references:
                        foreach ($data as $key => &$item) {
                            $itemsByReference[$item['id']] = &$item;
// Children array:
                            $itemsByReference[$item['id']]['children'] = array();
// Empty data class (so that json_encode adds "data: {}" ) 
                            $itemsByReference[$item['id']]['data'] = new \StdClass();
                        }

// Set items as children of the relevant parent item.
                        foreach ($data as $key => &$item)
                            if ($item['cod_pai'] && isset($itemsByReference[$item['cod_pai']]))
                                $itemsByReference [$item['cod_pai']]['children'][] = &$item;

// Remove items that were added to parents elsewhere:
                        foreach ($data as $key => &$item) {
                            if ($item['cod_pai'] && isset($itemsByReference[$item['cod_pai']]))
                                unset($data[$key]);
                        }
                        $result = $data;
                        break;
                    case 'create_node':
                        $node = isset($_GET['id']) && $_GET['id'] !== '#' ? (int) $_GET['id'] : 0;

                        $nodeText = isset($_GET['text']) && $_GET['text'] !== '' ? $_GET['text'] : '';
                        $novo = new VerticalEstrutura();
                        $novo->vertical_id = $vertical_id;
                        $novo->nome = $_GET['text'];
                        $novo->cod_pai = $node;
                        $novo->ordem = $_GET['position'] + 1;
                        $novo->tipo_estrutura = '1';
                        $novo->status = VerticalEstrutura::ATIVO;
                        $novo->created_by = \Yii::$app->user->identity->id ?? null;
                        $novo->created_at = date('Y-m-d H:i:s');
                        $novo->cod_temp = isset($_GET['cod_temp']) ? $_GET['cod_temp'] : null;

                        if (!$novo->save()) {
                            throw new HttpException(500, "Erro ao inserir o item, motivo: " . json_encode($novo->getErrors()));
                        }
//$sql = "INSERT INTO `vertical_estrutura` (`nome`, `cod_pai`) VALUES('" . $nodeText . "', '" . $node . "')";
//mysqli_query($conn, $sql);
//
                        //$result = array('id' => mysqli_insert_id($conn));

                        break;
                    case 'rename_node':
                        $node = isset($_GET['id']) && $_GET['id'] !== '#' ? (int) $_GET['id'] : 0;
//print_R($_GET);
                        $nodeText = isset($_GET['text']) && $_GET['text'] !== '' ? $_GET['text'] : '';

                        $atualiza = VerticalEstrutura::find()->where(['vertical_id' => $vertical_id, 'id' => $node, 'status' => VerticalEstrutura::ATIVO])->one();

                        if (!$atualiza) {
                            $atualiza = VerticalEstrutura::find()->where(['vertical_id' => $vertical_id, 'cod_temp' => $node, 'status' => VerticalEstrutura::ATIVO])->one();
                        }
                        if (!$atualiza) {
                            throw new HttpException(500, "Erro ao atualizar o item, motivo: não encontrado");
                        }

                        $atualiza->nome = $nodeText;
                        $atualiza->cod_temp = null;

                        if (!$atualiza->save()) {
                            throw new HttpException(500, "Erro ao atualizar o item, motivo: " . json_encode($novo->getErrors()));
                        }

//$sql = "UPDATE `vertical_estrutura` SET `nome`='" . $nodeText . "' WHERE `id`= '" . $node . "'";
//mysqli_query($conn, $sql);
                        break;
                    case 'delete_node':
                        $node = isset($_GET['id']) && $_GET['id'] !== '#' ? (int) $_GET['id'] : 0;

//itens impactados



                        $excluir = VerticalEstrutura::find()->where(['id' => $node])->one();
                        $excluir->status = VerticalEstrutura::INATIVO;

                        if (!$excluir->save()) {
                            throw new HttpException(500, "Erro ao excluir o item, motivo: " . json_encode($excluir->getErrors()));
                        }

                        break;
                    case 'get_content':
                        $node = isset($_GET['id']) && $_GET['id'] !== '#' ? (int) $_GET['id'] : 0;

                        $model = VerticalEstrutura::find()->where(['status' => VerticalEstrutura::ATIVO])->andWhere(['or', ['id' => $node], ['cod_temp' => $node]])->one();

                        $listaEstruturas = [1 => 'PVF/PVE', 'L' => 'Lista', 'C' => 'SubPVe'];


                        if ($model->tipo_estrutura != 'V') {
                            return $this->renderPartial('_estrutura', [
                                        'model' => $model,
                                        'listaEstruturas' => $listaEstruturas,
                            ]);
                        }

                        break;
                    case 'move_node':
                        $node = isset($_GET['id']) && $_GET['id'] !== '#' ? (int) $_GET['id'] : 0;
//print_R($_GET);
                        $nodeText = isset($_GET['text']) && $_GET['text'] !== '' ? $_GET['text'] : '';

                        $pai = isset($_GET['parent']) && $_GET['parent'] !== '' ? $_GET['parent'] : '';

                        $atualiza = VerticalEstrutura::find()->where(['id' => $node, 'status' => VerticalEstrutura::ATIVO])->one();

                        if (!$atualiza) {
                            $atualiza = VerticalEstrutura::find()->where(['cod_temp' => $node, 'status' => VerticalEstrutura::ATIVO])->one();
                        }
                        if (!$atualiza) {
                            throw new HttpException(500, "Erro ao atualizar o item, motivo: não encontrado");
                        }

                        $atualiza->cod_pai = $pai;

                        if (!$atualiza->save()) {
                            throw new HttpException(500, "Erro ao atualizar o item, motivo: " . json_encode($novo->getErrors()));
                        }

//$sql = "UPDATE `vertical_estrutura` SET `nome`='" . $nodeText . "' WHERE `id`= '" . $node . "'";
//mysqli_query($conn, $sql);
                        break;
                    default:
                        throw new \Exception('Unsupported operation: ' . $_GET['operation']);
                        break;
                }
                header('Content-Type: application/json; charset=utf-8');
                echo json_encode($result);
            } catch (Exception $e) {
                header($_SERVER["SERVER_PROTOCOL"] . ' 500 Server Error');
                header('Status:  500 Server Error');
                echo $e->getMessage();
            }
            die();
        }
    }

    public function actionAtualizaEstrutura() {

        \app\models\Base::loga("Atualizou a estrutura da vertical", $_GET, $_POST);


        $model = VerticalEstrutura::find()->where(['id' => $_POST['VerticalEstrutura']['id'], 'status' => VerticalEstrutura::ATIVO])->one();

        if (!$model) {
            return [
                'data' => [
                    'success' => false,
                    'model' => null,
                    'message' => 'Aconteceu um erro: ' . json_encode($model->getErrors()),
                ],
                'code' => 1, // Some semantic codes that you know them for yourself
            ];
        }

        if (Yii::$app->request->isAjax) {

            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

            if ($model->load(Yii::$app->request->post()) && $model->save()) {



                return [
                    'data' => [
                        'success' => true,
                        'model' => $model,
                        'message' => 'Model has been saved.',
                    ],
                    'code' => 0,
                ];
            } else {
                return [
                    'data' => [
                        'success' => false,
                        'model' => null,
                        'message' => 'Aconteceu um erro: ' . json_encode($model->getErrors()),
                    ],
                    'code' => 1, // Some semantic codes that you know them for yourself
                ];
            }
        }
    }

    public function actionItemAjax($id) {

        \app\models\Base::loga("Acessou o item ajax de Verticais", $_GET, $_POST);


        $tipo = substr($id, 0, 1);

        if (!in_array($tipo, ['I', 'A'])) {
            $tipo = 'E';
        }

        $ordem = [];
        $o = 1;


        $this->layout = '//empty';

        if ($tipo == 'E') {

            $item = substr($id, 1);

            $model = VerticalEstrutura::findOne($item);

            if (!$model) {
                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Estrutura " . $item . " não foi encontrado</div></div></div>";
            }

            if ($model->tipo_estrutura == 'V') {
                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Erro! O vértice não pode ser alterado</div></div></div>";
            }

            $irmaos = VerticalEstrutura::find()
                    ->where([
                        'vertical_id' => $model->vertical_id,
                        'cod_pai' => $model->cod_pai,
                        'status' => VerticalEstrutura::ATIVO,
                    ])
                    ->orderBy('ordem ASC, id ASC')
                    ->all();


            foreach ($irmaos as $irmao) {
                $ordem[$o] = $o;
                $o++;
            }
        }

        if ($tipo == 'I') {

            $item = substr($id, 1);

            $model = VerticalIndicador::findOne($item);

            if (!$model) {
                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Indicador " . $item . " não foi encontrado</div></div></div>";
            }

            $estruturaI = VerticalEstrutura::find()
                    ->select('id')
                    ->where([
                        'vertical_id' => $model->estrutura->vertical_id,
                        'status' => VerticalEstrutura::ATIVO,
                    ])
                    ->column();

            $irmaos = VerticalIndicador::find()
                    ->where([
//     'estrutura_id' => $model->estrutura_id,
                        'status' => VerticalIndicador::ATIVO,
                    ])
                    ->andWhere(['in', 'estrutura_id', $estruturaI])
                    ->orderBy('ordem ASC, id ASC')
                    ->all();


            foreach ($irmaos as $irmao) {
                $ordem[$o] = $o;
                $o++;
            }
        }

        if ($model->load(Yii::$app->request->post())) {

            $retorno = '';

            $connection = \Yii::$app->db;

            $transaction = $connection->beginTransaction();
            try {

                $mudou = false;

                if ($tipo == 'E') {

                    if ($model->oldAttributes['ordem'] != $model->ordem) {
                        $mudou = true;
                    }

                    if ($mudou) {
                        $posicaoItemAtualizando = null;

                        $irmaosArray = [];

                        foreach ($irmaos as $key => $irmao) {
                            $irmaosArray[] = $irmao->id;

                            if ($irmao->id == $model->id) {
                                $posicaoItemAtualizando = $key;
                            }
                        }

                        unset($irmaosArray[$posicaoItemAtualizando]);

                        $irmaosArray = array_values($irmaosArray);

                        array_splice($irmaosArray, $model->ordem - 1, 0, $model->id);

                        foreach ($irmaos as $irmao) {

                            $ordemNova = null;
                            if (in_array($irmao->id, $irmaosArray)) {

                                $ordemNova = array_search($irmao->id, $irmaosArray) + 1;
                            }
                            $irmao->ordem = $ordemNova;
                            if (!$irmao->save()) {
                                throw new HttpException(500, "Erro ao atualizar a ordem (irmãos) da estrutura " . $irmao->nome . ", motivo: " . json_encode($irmao->getErrors()));
                            }
                        }
                    }

                    if ($model->oldAttributes['nome'] != $model->nome) {
                        $mudou = true;
                    }

                    if (!$model->save()) {
                        throw new HttpException(500, "Erro ao atualizar a estrutura " . $model->nome . ", motivo: " . json_encode($model->getErrors()));
                    }

                    if ($mudou) {
                        // Yii::$app->session->setFlash('success', 'Estrutura atualizada com sucesso!');                       
                        Yii::$app->getSession()->setFlash('success', 'Estrutura atualizada com sucesso!');
                    }

                    $retorno = $model->vertical_id;
                }

                if ($tipo == 'I') {

                    if ($model->oldAttributes['ordem'] != $model->ordem) {
                        $mudou = true;
                    }

                    if ($mudou) {
                        $posicaoItemAtualizando = null;

                        $irmaosArray = [];

                        foreach ($irmaos as $key => $irmao) {
                            $irmaosArray[] = $irmao->id;

                            if ($irmao->id == $model->id) {
                                $posicaoItemAtualizando = $key;
                            }
                        }

                        unset($irmaosArray[$posicaoItemAtualizando]);

                        $irmaosArray = array_values($irmaosArray);

                        array_splice($irmaosArray, $model->ordem - 1, 0, $model->id);

                        foreach ($irmaos as $irmao) {

                            $ordemNova = null;
                            if (in_array($irmao->id, $irmaosArray)) {

                                $ordemNova = array_search($irmao->id, $irmaosArray) + 1;
                            }
                            $irmao->ordem = $ordemNova;
                            if (!$irmao->save()) {
                                throw new HttpException(500, "Erro ao atualizar a ordem (irmãos) do indicador " . $irmao->nome . ", motivo: " . json_encode($irmao->getErrors()));
                            }
                        }
                    }

                    if ($model->oldAttributes['nome'] != $model->nome) {
                        $mudou = true;
                    }

                    if ($model->tipo == VerticalIndicador::TIPO_LISTA) {

                        VerticalAlternativa::updateAll(['status' => VerticalAlternativa::INATIVO], ['indicador_id' => $model->id]);

                        VerticalIndicadorTemParametro::updateAll(['status' => VerticalIndicadorTemParametro::INATIVO], ['vertical_indicador_id' => $model->id]);

                        if (!$model->save()) {
                            throw new HttpException(500, "Erro ao atualizar o indicador " . $model->nome . ", motivo: " . json_encode($model->getErrors()));
                        }

                        if ($model->usa_interpolacao == Vertical::INTERPOLACAO_SIM) {

                            $chaves = end($_POST['VerticalAlternativaInterpolacao']);
                            $tamanho = max(array_keys($chaves));

                            for ($i = 0; $i <= $tamanho; $i++) {
                                if (isset($_POST['VerticalAlternativaInterpolacao']['nome'][$i])) {
                                    if (!empty($_POST['VerticalAlternativaInterpolacao']['nome'][$i])) {
                                        $alternativa = new VerticalAlternativa();
                                        $alternativa->nome = isset($_POST['VerticalAlternativaInterpolacao']['nome'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nome'][$i] : '';
                                        $alternativa->status = VerticalAlternativa::ATIVO;
                                        $alternativa->indicador_id = $model->id;
                                        $alternativa->ordem = $i + 1;
                                        $alternativa->nivel_esforco = isset($_POST['VerticalAlternativaInterpolacao']['nivel_esforco'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nivel_esforco'][$i] : '';
                                        $alternativa->nivel_referencia = isset($_POST['VerticalAlternativaInterpolacao']['nivel_referencia'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nivel_referencia'][$i] : '';
                                        $alternativa->nivel_referencia_bn = isset($_POST['VerticalAlternativaInterpolacao']['nivel_referencia_bn'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nivel_referencia_bn'][$i] : '';
                                        $alternativa->created_by = \Yii::$app->user->identity->id ?? null;
                                        $alternativa->created_at = date('Y-m-d H:i:s');
                                        $alternativa->interpolacao_absoluto = isset($_POST['VerticalAlternativaInterpolacao']['interpolacao_absoluto'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['interpolacao_absoluto'][$i] : '';
                                        //Utils::debug([$alternativa, $i]);
                                        if (!$alternativa->save()) {
                                            throw new HttpException(500, "Erro ao salvar a alternativa Interpolacao, motivo: " . json_encode($alternativa->getErrors()));
                                        }
                                    }
                                }
                            }
                        } else {
                            $chaves = end($_POST['VerticalAlternativa']);
                            $tamanho = max(array_keys($chaves));
                            //$tamanho = sizeOf($chaves);
                            //Utils::debug([end($_POST['VerticalAlternativa']), $_POST['VerticalAlternativa'], max($_POST['VerticalAlternativa']), $tamanho]);

                            for ($i = 0; $i <= $tamanho; $i++) {
                                if (isset($_POST['VerticalAlternativa']['nome'][$i])) {
                                    if (!empty($_POST['VerticalAlternativa']['nome'][$i])) {
                                        $alternativa = new VerticalAlternativa();
                                        $alternativa->nome = isset($_POST['VerticalAlternativa']['nome'][$i]) ? $_POST['VerticalAlternativa']['nome'][$i] : '';
                                        $alternativa->status = VerticalAlternativa::ATIVO;
                                        $alternativa->indicador_id = $model->id;
                                        $alternativa->ordem = $i + 1;
                                        $alternativa->nivel_esforco = isset($_POST['VerticalAlternativa']['nivel_esforco'][$i]) ? $_POST['VerticalAlternativa']['nivel_esforco'][$i] : '';
                                        $alternativa->nivel_referencia = isset($_POST['VerticalAlternativa']['nivel_referencia'][$i]) ? $_POST['VerticalAlternativa']['nivel_referencia'][$i] : '';
                                        $alternativa->nivel_referencia_bn = isset($_POST['VerticalAlternativa']['nivel_referencia_bn'][$i]) ? $_POST['VerticalAlternativa']['nivel_referencia_bn'][$i] : '';
                                        $alternativa->created_by = \Yii::$app->user->identity->id ?? null;
                                        $alternativa->created_at = date('Y-m-d H:i:s');
                                        $alternativa->interpolacao_absoluto = isset($_POST['VerticalAlternativa']['interpolacao_absoluto'][$i]) ? $_POST['VerticalAlternativa']['interpolacao_absoluto'][$i] : '';
                                        //Utils::debug([$alternativa, $i]);
                                        if (!$alternativa->save()) {
                                            throw new HttpException(500, "Erro ao salvar a alternativa, motivo: " . json_encode($alternativa->getErrors()));
                                        }
                                    }
                                }
                            }
                        }

                        $chavesParametro = max(array_keys($_POST['VerticalIndicadorTemParametro']['parametro']));

                        for ($i = 0; $i <= $chavesParametro; $i++) {
                            if (
                                    isset($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) && !empty($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) && isset($_POST['VerticalIndicadorTemParametro']['valor'][$i]) && !empty($_POST['VerticalIndicadorTemParametro']['valor'][$i])
                            ) {
                                $parametro = new VerticalIndicadorTemParametro();
                                $parametro->parametro = isset($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) ? $_POST['VerticalIndicadorTemParametro']['parametro'][$i] : '';
                                $parametro->valor = isset($_POST['VerticalIndicadorTemParametro']['valor'][$i]) ? $_POST['VerticalIndicadorTemParametro']['valor'][$i] : '';
                                $parametro->tipo = 1;
                                $parametro->status = VerticalIndicadorTemParametro::ATIVO;
                                $parametro->vertical_indicador_id = $model->id;
                                $parametro->created_by = \Yii::$app->user->identity->id ?? null;
                                $parametro->created_at = date('Y-m-d H:i:s');

                                if (!$parametro->save()) {
                                    throw new HttpException(500, "Erro ao salvar o parâmetro, motivo: " . json_encode($parametro->getErrors()));
                                }
                            }
                        }

                        //grupos

                        \app\modules\performance\models\VerticalGrupoTemIndicador::deleteAll(['vertical_indicador_id' => $model->id]);

                        if ($model->grupos) {
                            foreach ($model->grupos as $grupo) {

                                $grupoExiste = \app\modules\performance\models\VerticalGrupo::find()
                                        ->where([
                                            'vertical_id' => $model->estrutura->vertical_id,
                                            'nome' => $grupo])
                                        ->one();
                                if (!$grupoExiste) {

                                    $grupoExiste = new \app\modules\performance\models\VerticalGrupo();
                                    $grupoExiste->vertical_id = $model->estrutura->vertical_id;
                                    $grupoExiste->nome = $grupo;

                                    if (!$grupoExiste->save()) {
                                        throw new HttpException(500, "Erro ao salvar o grupo novo, motivo: " . json_encode($grupoExiste->getErrors()));
                                    }
                                }

                                $verticalGrupoIndicador = new \app\modules\performance\models\VerticalGrupoTemIndicador();
                                $verticalGrupoIndicador->vertical_grupo_id = $grupoExiste->id;
                                $verticalGrupoIndicador->vertical_indicador_id = $model->id;

                                if (!$verticalGrupoIndicador->save()) {
                                    throw new HttpException(500, "Erro ao associar o indicador ao grupo, motivo: " . json_encode($verticalGrupoIndicador->getErrors()));
                                }
                            }
                        }

                        //if ($mudou) {
                        //Yii::$app->session->setFlash('success', 'Indicador atualizado com sucesso!');
                        Yii::$app->getSession()->setFlash('success', "Indicador atualizado com sucesso!");
                        //}

                        $retorno = $model->estrutura->vertical_id;
                    }
                }
                $transaction->commit();

                return $this->redirect(['/performance/vertical/view', 'id' => $retorno]);
            } catch (Exception $e) {
                $transaction->rollback();

                throw new HttpException(500, $e->getMessage());
            }
        }

        if ($tipo == 'I') {

            $parametrosPadrao = VerticalIndicadorParametro::find()
                    ->where(['vertical_id' => $model->estrutura->vertical_id])
                    ->asArray()
                    ->all();

            $model->grupos = ['teste' => 'teste'];

            return $this->render('_form_indicador_ajax', [
                        'model' => $model,
                        'tipo' => $tipo,
                        'ordem' => $ordem,
                        'parametrosPadrao' => $parametrosPadrao,
            ]);
        } else {
            return $this->render('_form_item_ajax', [
                        'model' => $model,
                        'tipo' => $tipo,
                        'ordem' => $ordem,
            ]);
        }
    }

    public function actionListaProjetosPossiveis() {

        \app\models\Base::loga("Acessou a lista de projetos possiveis de Verticais", $_GET, $_POST);


        $this->layout = 'empty';

        $out = [];
        $selected = [];
        if (isset($_POST['depdrop_parents'])) {
            $parents = $_POST['depdrop_parents'];
            if ($parents != null) {
                $verticalId = $parents[0];

                $list = Projeto::find()->where(['vertical_id' => $verticalId, 'status' => Projeto::ATIVO])->asArray()->all();
                $selected = null;
                if ($verticalId != null && count($list) > 0) {
                    $selected = '';
                    if ($_POST['depdrop_all_params']['projeto']) {
                        $selected = $_POST['depdrop_all_params']['projeto'];
                    }
                    foreach ($list as $i => $account) {
                        $out[] = ['id' => $account['id'], 'name' => $account['nome']];
                    }
// Shows how you can preselect a value
                    echo Json::encode(['output' => $out, 'selected' => $selected]);
                    exit();
                    return;
                }
                echo Json::encode(['output' => $out, 'selected' => '']);
                exit();
                return;
            }
        }
        echo Json::encode(['output' => '', 'selected' => '']);
        exit();
    }

    public function actionAdicionaItemAjax($id) {

        \app\models\Base::loga("Acessou o adiciona item ajax de Verticais", $_GET, $_POST);

        $model = new VerticalEstrutura();

        $model->created_at = date('Y-m-d H:i:s');
        $model->updated_at = date('Y-m-d H:i:s');

        $ordem = [];
        $o = 1;
        $tipo = 'E';

        $this->layout = '//empty';

        $pai = VerticalEstrutura::findOne(substr($id, 1));

        if (!$pai) {
            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Estrutura " . $id . " não foi encontrado</div></div></div>";
        }

        $irmaos = VerticalEstrutura::find()
                ->where([
                    'vertical_id' => $pai->vertical_id,
                    'cod_pai' => $pai->id,
                    'status' => VerticalEstrutura::ATIVO,
                ])
                ->orderBy('ordem ASC, id ASC')
                ->all();

//Utils::debug($irmaos);
        foreach ($irmaos as $irmao) {
            $ordem[$o] = $o;
            $o++;
        }

        $on = $o++;
        $ordem[$on] = $on;

        if ($model->load(Yii::$app->request->post())) {

            $model->ordem = $model->ordem - 1;

            $posicaoItemAtualizando = null;

            $irmaosArray = [];

            foreach ($irmaos as $key => $irmao) {
                $irmaosArray[] = $irmao->id;

                if ($irmao->id == $model->id) {
                    $posicaoItemAtualizando = $key;
                }
            }

            unset($irmaosArray[$posicaoItemAtualizando]);

            $irmaosArray = array_values($irmaosArray);

            array_splice($irmaosArray, $model->ordem - 1, 0, $model->id);

            foreach ($irmaos as $irmao) {

                $ordemNova = null;
                if (in_array($irmao->id, $irmaosArray)) {

                    $ordemNova = array_search($irmao->id, $irmaosArray) + 1;
                }
                $irmao->ordem = $ordemNova;
                if (!$irmao->save()) {
                    throw new HttpException(500, "Erro ao atualizar a ordem (irmãos) da estrutura " . $irmao->nome . ", motivo: " . json_encode($irmao->getErrors()));
                }
            }

            $model->cod_pai = $pai->id;
            $model->vertical_id = $pai->vertical_id;
            $model->created_by = \Yii::$app->user->identity->id ?? null;
            $model->status = ColetaEstrutura::ATIVO;


            if (!$model->save()) {
                throw new HttpException(500, "Erro ao atualizar a estrutura " . $model->nome . ", motivo: " . json_encode($model->getErrors()));
            }

            Yii::$app->getSession()->setFlash('success', 'Item adicionado com sucesso!');

            return $this->redirect(['/performance/vertical/view', 'id' => $model->vertical_id]);
        }

        $model->ordem = max(array_keys($ordem));

        return $this->render('_form_item_ajax', [
                    'model' => $model,
                    'tipo' => $tipo,
                    'ordem' => $ordem,
        ]);
    }

    public function actionAdicionaIndicadorAjax($id) {

        \app\models\Base::loga("Acessou o adiciona indicador ajax de Verticais", $_GET, $_POST);

        $model = new VerticalIndicador();

        $this->layout = '//empty';

        $pai = VerticalEstrutura::findOne(substr($id, 1));

        if (!$pai) {
            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Estrutura " . $id . " não foi encontrado</div></div></div>";
        }

        $irmaos = VerticalIndicador::find()
                ->where([
                    'estrutura_id' => $pai->id,
                    'status' => VerticalIndicador::ATIVO,
                ])
                ->orderBy('ordem ASC, id ASC')
                ->all();

        $o = 1;
        foreach ($irmaos as $irmao) {
            $ordem[$o] = $o;
            $o++;
        }

        $on = $o++;
        $ordem[$on] = $on;

        if ($model->load(Yii::$app->request->post())) {

            //  viewUtils::debug(Yii::$app->request->post());

            $msg = '';
            $valid = true;

            $connection = \Yii::$app->db;

            $transaction = $connection->beginTransaction();

            try {

                $model->estrutura_id = $pai->id;
                $model->obrigatorio = VerticalIndicador::NAO;
                $model->status = VerticalIndicador::ATIVO;
                $model->created_by = \Yii::$app->user->identity->id ?? null;
                $model->created_at = date('Y-m-d H:i:s');

                if (!$model->save()) {
                    throw new HttpException(500, "Erro ao salvar o indicador, motivo: " . json_encode($model->getErrors()));
                }

                $posicaoItemAtualizando = null;

                $irmaosArray = [];

                foreach ($irmaos as $key => $irmao) {
                    $irmaosArray[] = $irmao->id;

                    if ($irmao->id == $model->id) {
                        $posicaoItemAtualizando = $key;
                    }
                }

                unset($irmaosArray[$posicaoItemAtualizando]);

                $irmaosArray = array_values($irmaosArray);

                array_splice($irmaosArray, $model->ordem - 1, 0, $model->id);

                foreach ($irmaos as $irmao) {

                    $ordemNova = null;
                    if (in_array($irmao->id, $irmaosArray)) {

                        $ordemNova = array_search($irmao->id, $irmaosArray) + 1;
                    }
                    $irmao->ordem = $ordemNova;
                    if (!$irmao->save()) {
                        throw new HttpException(500, "Erro ao atualizar a ordem (irmãos) da estrutura " . $irmao->nome . ", motivo: " . json_encode($irmao->getErrors()));
                    }
                }

                //
                //$i = 0;

                if ($model->usa_interpolacao == Vertical::INTERPOLACAO_SIM) {

                    $chaves = 0;
                    $tamanho = 0;

                    if (isset($_POST['VerticalAlternativaInterpolacao'])) {
                        $chaves = end($_POST['VerticalAlternativaInterpolacao']);
                        $tamanho = sizeOf($chaves);
                    }


                    for ($i = 0; $i < $tamanho; $i++) {
                        if (isset($_POST['VerticalAlternativaInterpolacao']['nome'][$i])) {
                            if (!empty($_POST['VerticalAlternativaInterpolacao']['nome'][$i])) {
                                $alternativa = new VerticalAlternativa();
                                $alternativa->nome = isset($_POST['VerticalAlternativaInterpolacao']['nome'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nome'][$i] : '';
                                $alternativa->status = VerticalAlternativa::ATIVO;
                                $alternativa->indicador_id = $model->id;
                                $alternativa->ordem = $i + 1;
                                $alternativa->nivel_esforco = isset($_POST['VerticalAlternativaInterpolacao']['nivel_esforco'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nivel_esforco'][$i] : '';
                                $alternativa->nivel_referencia = isset($_POST['VerticalAlternativaInterpolacao']['nivel_referencia'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nivel_referencia'][$i] : '';
                                $alternativa->nivel_referencia_bn = isset($_POST['VerticalAlternativaInterpolacao']['nivel_referencia_bn'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['nivel_referencia_bn'][$i] : '';
                                $alternativa->created_by = \Yii::$app->user->identity->id ?? null;
                                $alternativa->created_at = date('Y-m-d H:i:s');
                                $alternativa->interpolacao_absoluto = isset($_POST['VerticalAlternativaInterpolacao']['interpolacao_absoluto'][$i]) ? $_POST['VerticalAlternativaInterpolacao']['interpolacao_absoluto'][$i] : '';
                                //Utils::debug([$alternativa, $i]);
                                if (!$alternativa->save()) {
                                    throw new HttpException(500, "Erro ao salvar a alternativa Interpolacao, motivo: " . json_encode($alternativa->getErrors()));
                                }
                            }
                        }
                    }
                } else {
                    $chaves = end($_POST['VerticalAlternativa']);
                    $tamanho = sizeOf($chaves);

                    for ($i = 0; $i < $tamanho; $i++) {
                        if (isset($_POST['VerticalAlternativa']['nome'][$i])) {
                            if (!empty($_POST['VerticalAlternativa']['nome'][$i])) {
                                $alternativa = new VerticalAlternativa();
                                $alternativa->nome = isset($_POST['VerticalAlternativa']['nome'][$i]) ? $_POST['VerticalAlternativa']['nome'][$i] : '';
                                $alternativa->status = VerticalAlternativa::ATIVO;
                                $alternativa->indicador_id = $model->id;
                                $alternativa->ordem = $i + 1;
                                $alternativa->nivel_esforco = isset($_POST['VerticalAlternativa']['nivel_esforco'][$i]) ? $_POST['VerticalAlternativa']['nivel_esforco'][$i] : '';
                                $alternativa->nivel_referencia = isset($_POST['VerticalAlternativa']['nivel_referencia'][$i]) ? $_POST['VerticalAlternativa']['nivel_referencia'][$i] : '';
                                $alternativa->nivel_referencia_bn = isset($_POST['VerticalAlternativa']['nivel_referencia_bn'][$i]) ? $_POST['VerticalAlternativa']['nivel_referencia_bn'][$i] : '';
                                $alternativa->created_by = \Yii::$app->user->identity->id ?? null;
                                $alternativa->created_at = date('Y-m-d H:i:s');
                                $alternativa->interpolacao_absoluto = isset($_POST['VerticalAlternativa']['interpolacao_absoluto'][$i]) ? $_POST['VerticalAlternativa']['interpolacao_absoluto'][$i] : '';
                                //Utils::debug([$alternativa, $i]);
                                if (!$alternativa->save()) {
                                    throw new HttpException(500, "Erro ao salvar a alternativa, motivo: " . json_encode($alternativa->getErrors()));
                                }
                            }
                        }
                    }
                }

                $chavesParametro = max(array_keys($_POST['VerticalIndicadorTemParametro']['parametro']));

                for ($i = 0; $i <= $chavesParametro; $i++) {
                    if (
                            isset($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) && !empty($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) && isset($_POST['VerticalIndicadorTemParametro']['valor'][$i]) && !empty($_POST['VerticalIndicadorTemParametro']['valor'][$i])
                    ) {
                        $parametro = new VerticalIndicadorTemParametro();
                        $parametro->parametro = isset($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) ? $_POST['VerticalIndicadorTemParametro']['parametro'][$i] : '';
                        $parametro->valor = isset($_POST['VerticalIndicadorTemParametro']['valor'][$i]) ? $_POST['VerticalIndicadorTemParametro']['valor'][$i] : '';
                        $parametro->tipo = 1;
                        $parametro->status = VerticalIndicadorTemParametro::ATIVO;
                        $parametro->vertical_indicador_id = $model->id;
                        $parametro->created_by = \Yii::$app->user->identity->id ?? null;
                        $parametro->created_at = date('Y-m-d H:i:s');

                        if (!$parametro->save()) {
                            throw new HttpException(500, "Erro ao salvar o parâmetro, motivo: " . json_encode($parametro->getErrors()));
                        }
                    }
                }

                $texto = 'Foi criado o indicador ' . $model->id . ' - "' . $model->nome . '" na vertical ' . $model->estrutura->vertical->nome . ' as ' . date('d/m/Y H:i');

//                $email = \Yii::$app->mailer->compose('@app/mail/message', [
//                            'content' => $texto,
//                        ])
//                        ->setFrom('no-reply@krinom.com.br')
//                        ->setSubject('Indicador adicionado na vertical ' . $model->estrutura->vertical->nome)
//                        ->send();


                $transaction->commit();

                Yii::$app->getSession()->setFlash('success', 'Indicador adicionado com sucesso!');

                return $this->redirect(['/performance/vertical/view', 'id' => $pai->vertical_id]);
            } catch (Exception $ex) {

                $transaction->rollback();

                throw new HttpException(500, $ex->getMessage());
            }
        }

        $tipo = [
            VerticalIndicador::TIPO_LISTA => 'Normal',
//            VerticalIndicador::TIPO_MULTIPLE => 'Múltipla',
//            VerticalIndicador::TIPO_STRING => 'Texto',
//            VerticalIndicador::TIPO_NUMERICO => 'Númerico',
//            VerticalIndicador::TIPO_DATA => 'Data',
        ];

        if (!$model->ordem) {
            $model->ordem = max(array_keys($ordem));
        }

        $parametrosPadrao = VerticalIndicadorParametro::find()
                ->where(['vertical_id' => $pai->vertical_id])
                ->asArray()
                ->all();

        return $this->render('_form_indicador_ajax', [
                    'model' => $model,
                    'tipo' => $tipo,
                    'ordem' => $ordem,
                    'parametrosPadrao' => $parametrosPadrao,
        ]);
    }

    public function actionDuplica($id) {

        \app\models\Base::loga("Acessou o duplica de Verticais", $_GET, $_POST);

        $this->layout = '//empty';

        $tipo = substr($id, 0, 1);

        if (!in_array($tipo, ['I', 'A'])) {
            $tipo = 'E';
        }

        if ($tipo == 'E') {

            $item = substr($id, 1);

            $model = VerticalEstrutura::findOne($item);

            if (!$model) {
                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Estrutura " . $item . " não foi encontrado</div></div></div>";
            }

            if ($model->tipo_estrutura == 'V') {
                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Erro! O vértice não pode ser duplicado</div></div></div>";
            }

            $duplica = new VerticalEstrutura();
            $duplica->nome = $model->nome . " (duplicado)";
            $duplica->cod_pai = $model->cod_pai;
            $duplica->ordem = $model->ordem++;
            $duplica->tipo_estrutura = $model->tipo_estrutura;
            $duplica->nome_reduzido = $model->nome_reduzido;
            $duplica->taxa_substituicao = $model->taxa_substituicao;
            $duplica->vertical_id = $model->vertical_id;
            $duplica->created_by = \Yii::$app->user->identity->id ?? null;
            $duplica->status = ColetaEstrutura::ATIVO;

            if (!$duplica->save()) {
                throw new HttpException(500, "Erro ao duplicar o item, motivo: " . $duplica->getErrors());
            }

            Yii::$app->getSession()->setFlash('success', 'Item duplicado com sucesso!');

            return $this->redirect(['/performance/vertical/view', 'id' => $model->vertical_id]);
        }
    }

    public function actionExcluiItem() {

        \app\models\Base::loga("Acessou o exclui item de Verticais", $_GET, $_POST);

        $this->layout = '//empty';

        if (!isset($_POST['id'])) {
            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Falta parâmetro obrigatório 'item a ser excluído'</div></div></div>";
        }

        if (!isset($_POST['vertical'])) {
            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Falta parâmetro obrigatório 'item a ser excluído'</div></div></div>";
        }

        $vertical = $_POST['vertical'];

        $itens = [];

        $itens[] = $_POST['id'];

        if (isset($_POST['filhos'])) {
            $itens = array_merge($itens, $_POST['filhos']);
        }

        $msg = '';
        $valid = true;

        $connection = \Yii::$app->db;

        $transaction = $connection->beginTransaction();

        try {

            foreach ($itens as $item) {

                $tipo = substr($item, 0, 1);

                if ($tipo == 'E') {

                    $item = substr($item, 1);

                    $model = VerticalEstrutura::findOne($item);

                    if (!$model) {
                        $valid = false;
                        $msg .= "Estrutura " . $item . " não foi encontrado";
                    }

                    if ($model->tipo_estrutura == 'V') {
                        $valid = false;
                        $msg .= "Erro! O vértice não pode ser excluído";
                    }

                    $model->status = VerticalEstrutura::INATIVO;

                    if (!$model->save()) {
                        $valid = false;
                        $msg .= "Erro ao excluir o item, motivo: " . json_encode($model->getErrors());
                    }
                }

                if ($tipo == 'I') {

                    $item = substr($item, 1);

                    $model = VerticalIndicador::findOne($item);

                    if (!$model) {
                        $valid = false;
                        $msg .= "Indicador " . $item . " não foi encontrado";
                    }

                    $model->status = VerticalEstrutura::INATIVO;

                    if (!$model->save()) {
                        $valid = false;
                        $msg .= "Erro ao excluir o indicador, motivo: " . json_encode($model->getErrors());
                    }

                    if ($valid) {

                        $texto = 'Foi excluído o indicador ' . $model->id . ' - "' . $model->nome . '" na vertical ' . $model->estrutura->vertical->nome . ' as ' . date('d/m/Y H:i');

//                        $email = \Yii::$app->mailer->compose('@app/mail/message', [
//                                    'content' => $texto,
//                                ])
//                                ->setFrom('no-reply@krinom.com.br')
//                                ->setSubject('Indicador excluído da vertical ' . $model->estrutura->vertical->nome)
//                                ->send();
                    }
                }

                if ($tipo == 'A') {

                    $item = substr($item, 1);

                    $model = VerticalAlternativa::findOne($item);

                    if (!$model) {
                        $valid = false;
                        $msg .= "Alternativa " . $item . " não foi encontrada";
                    }

                    $model->status = VerticalAlternativa::INATIVO;

                    if (!$model->save()) {
                        $valid = false;
                        $msg .= "Erro ao excluir a alternativa, motivo: " . json_encode($model->getErrors());
                    }
                }
            }

            if ($valid) {
                $transaction->commit();

                Yii::$app->getSession()->setFlash('success', 'Item excluído com sucesso!');

                return $this->redirect(['/performance/vertical/view', 'id' => $vertical]);
            } else {
                $transaction->rollback();
                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'> " . $msg . "</div></div></div>";
            }
        } catch (Exception $e) {
            $transaction->rollback();

            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Erro ao excluir o item, motivo: " . $e->getMessage() . "</div></div></div>";
        }
    }

    public function actionMoveItem($origem, $destino, $posicao) {

        \app\models\Base::loga("Acessou o move item de Verticais", $_GET, $_POST);

        $this->layout = '//empty';

        $ordem = [];
        $o = 1;

        $tipoOrigem = substr($origem, 0, 1);

        if (in_array($tipoOrigem, ['A'])) {
            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Alternativa não pode ser movido, use a ferramenta de editar</div></div></div>";
        }

        if ($destino == '#') {
            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Vértice não pode ser movido</div></div></div>";
        }

        $tipoDestino = substr($destino, 0, 1);


        if (in_array($tipoDestino, ['I', 'A'])) {
            return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Indicadores e alternativas não pode ter sub itens</div></div></div>";
        }

        $itemOrigem = substr($origem, 1);

        $itemDestino = substr($destino, 1);

        if ($tipoOrigem == 'E') {

            $modelOrigem = VerticalEstrutura::findOne($itemOrigem);

            if (!$modelOrigem) {
                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Estrutura " . $itemOrigem . " de origem não encontrado</div></div></div>";
            }

            $irmaos = VerticalEstrutura::find()
                    ->where([
                        'vertical_id' => $modelOrigem->vertical_id,
                        'cod_pai' => $modelOrigem->cod_pai,
                        'status' => VerticalEstrutura::ATIVO,
                    ])
                    ->orderBy('ordem ASC, id ASC')
                    ->all();


            foreach ($irmaos as $irmao) {
                $ordem[$o] = $o;
                $o++;
            }

            $modelOrigem->cod_pai = $itemDestino;

            $modelOrigem->ordem = $posicao + 1;

            $posicaoItemAtualizando = null;

            $irmaosArray = [];

            foreach ($irmaos as $key => $irmao) {
                $irmaosArray[] = $irmao->id;

                if ($irmao->id == $modelOrigem->id) {
                    $posicaoItemAtualizando = $key;
                }
            }

            unset($irmaosArray[$posicaoItemAtualizando]);

            $irmaosArray = array_values($irmaosArray);

            array_splice($irmaosArray, $modelOrigem->ordem - 1, 0, $modelOrigem->id);

            foreach ($irmaos as $irmao) {

                $ordemNova = null;
                if (in_array($irmao->id, $irmaosArray)) {

                    $ordemNova = array_search($irmao->id, $irmaosArray) + 1;
                }
                $irmao->ordem = $ordemNova;
                if (!$irmao->save()) {
                    throw new HttpException(500, "Erro ao atualizar a ordem (irmãos) da estrutura " . $irmao->nome . ", motivo: " . json_encode($irmao->getErrors()));
                }
            }

            if (!$modelOrigem->save()) {
                return "Erro ao mover o item, motivo: " . \GuzzleHttp\json_encode($modelOrigem->getErrors());
            }

            return true;
        }

        if ($tipoOrigem == 'I') {

            $modelOrigem = VerticalIndicador::findOne($itemOrigem);


            if (!$modelOrigem) {
                return "Indicador " . $itemOrigem . " de origem não encontrado";
            }
            $irmaos = VerticalIndicador::find()
                    ->where([
                        'estrutura_id' => $modelOrigem->estrutura_id,
                        'status' => VerticalIndicador::ATIVO,
                    ])
                    ->orderBy('ordem ASC, id ASC')
                    ->all();


            foreach ($irmaos as $irmao) {
                $ordem[$o] = $o;
                $o++;
            }

            $modelOrigem->estrutura_id = $itemDestino;

            $modelOrigem->ordem = $posicao + 1;

            $posicaoItemAtualizando = null;

            $irmaosArray = [];

            foreach ($irmaos as $key => $irmao) {
                $irmaosArray[] = $irmao->id;

                if ($irmao->id == $modelOrigem->id) {
                    $posicaoItemAtualizando = $key;
                }
            }

            unset($irmaosArray[$posicaoItemAtualizando]);

            $irmaosArray = array_values($irmaosArray);

            array_splice($irmaosArray, $modelOrigem->ordem - 1, 0, $modelOrigem->id);

            foreach ($irmaos as $irmao) {

                $ordemNova = null;
                if (in_array($irmao->id, $irmaosArray)) {

                    $ordemNova = array_search($irmao->id, $irmaosArray) + 1;
                }
                $irmao->ordem = $ordemNova;
                if (!$irmao->save()) {
                    throw new HttpException(500, "Erro ao atualizar a ordem (irmãos) da estrutura " . $irmao->nome . ", motivo: " . json_encode($irmao->getErrors()));
                }
            }
            if (!$modelOrigem->save()) {
                return "Erro ao mover o indicador, motivo: " . \GuzzleHttp\json_encode($modelOrigem->getErrors());
            }

            return true;
        }
    }

    public function actionAnalise($id) {

        \app\models\Base::loga("Acessou a análise da Vertical", $_GET, $_POST);

        $vertical = Vertical::find()
                ->where([
                    'id' => $id,
                    'status' => Vertical::ATIVO
                ])
                ->one();

        if (!$vertical) {
            throw new HttpException(500, "Erro! Vertical não encontrada");
        }
        $searchModel = new \app\modules\performance\models\VerticalIndicadorSearch();

        $dataProvider = $searchModel->analise(Yii::$app->request->queryParams, $vertical);

        return $this->render('analise', [
                    'searchModel' => $searchModel,
                    'dataProvider' => $dataProvider,
                    'vertical' => $vertical,
        ]);
    }

    public function actionCardinalAjax($esforco, $bn) {

        \app\models\Base::loga("Alterou a escala cardinal de um indicador", $_GET, $_POST);


        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

        $debug = false;
        if (isset($_GET['debug'])) {
            $debug = true;
        }

        return Vertical::calculaEscalaCardinal($esforco, $bn, $debug);
    }

    public function actionCopia($id) {

        \app\models\Base::loga("Acessou o copia de Verticais", $_GET, $_POST);


        $origem = Vertical::findOne($id);

        if (!$origem) {
            throw new HttpException(500, "Erro! Vertical não encontrada");
        }

        $destino = new Vertical();
        $destino->nome = $origem->nome . ' (duplicada)';
        $destino->observacao = $origem->observacao;
        $destino->status = Vertical::ATIVO;
        $destino->created_by = \Yii::$app->user->identity->id ?? null;
        $destino->created_at = date('Y-m-d H:i:s');
        $destino->vertical_agrupador_id = $origem->vertical_agrupador_id;
        $destino->tipo = $origem->tipo;
        $destino->descricao = $origem->descricao;
        $destino->regra = $origem->regra;
        $destino->origem_dados = $origem->origem_dados;
        $destino->origem_vertical = $origem->origem_vertical;
        $destino->cod_backoffice = $origem->cod_backoffice;
        $destino->periodicidade = $origem->periodicidade;
        $destino->interpolacao = $origem->interpolacao;

        if (!$destino->save()) {
            throw new HttpException(500, "Erro ao salvar a Vertical, motivo: " . json_encode($destino->getErrors()));
        }

        $parametrosVerticalBase = VerticalIndicadorParametro::find()
                ->where([
                    'vertical_id' => $origem->id,
                ])
                ->all();

        foreach ($parametrosVerticalBase as $parametroVerticalBase) {

            $parametroVerticalDestino = new VerticalIndicadorParametro();
            $parametroVerticalDestino->vertical_id = $destino->id;
            $parametroVerticalDestino->parametro = $parametroVerticalBase->parametro;
            $parametroVerticalDestino->valor = $parametroVerticalBase->valor;

            if (!$parametroVerticalDestino->save()) {

                $texto = "ERRO ao salvar os parametros da vertical " . $destino->id . "', motivo: " . json_encode($parametroVerticalDestino->getErrors()) . PHP_EOL;

                throw new \yii\web\HttpException(500, $texto);
            }
        }

        $estruturasBase = VerticalEstrutura::find()
                ->where([
                    'vertical_id' => $origem->id,
                    'status' => VerticalEstrutura::ATIVO
                ])
                ->all();

        foreach ($estruturasBase as $estruturaBase) {

            if ($estruturaBase->status == VerticalEstrutura::ATIVO) {

                $destinoEstrutura = new VerticalEstrutura();
                $destinoEstrutura->nome = $estruturaBase->nome;
                $destinoEstrutura->cod_pai = $estruturaBase->cod_pai;
                $destinoEstrutura->ordem = $estruturaBase->ordem;
                $destinoEstrutura->tipo_estrutura = $estruturaBase->tipo_estrutura;
                $destinoEstrutura->vertical_id = $destino->id;
                $destinoEstrutura->taxa_substituicao = $estruturaBase->taxa_substituicao;
                $destinoEstrutura->status = VerticalEstrutura::ATIVO;
                $destinoEstrutura->created_by = Yii::$app->user->identity->id ?? null;
                $destinoEstrutura->created_at = date('Y-m-d H:i:s');
                $destinoEstrutura->cod_temp = $estruturaBase->id;

                if (!$destinoEstrutura->save()) {

                    $texto = "ERRO ao salvar o item de estrutura da vertical " . $destino->id . "', motivo: " . json_encode($destinoEstrutura->getErrors()) . PHP_EOL;

                    throw new \yii\web\HttpException(500, $texto);
                }

                $ordemIndicador = null;

                $indicadoresBase = null;

                $indicadoresBase = VerticalIndicador::find()
                        ->where([
                            'estrutura_id' => $estruturaBase->id,
                            'status' => VerticalIndicador::ATIVO,
                        ])
                        ->all();

                if ($indicadoresBase) {
                    foreach ($indicadoresBase as $indicadorBase) {

                        if ($indicadorBase->status == VerticalIndicador::ATIVO) {

                            $destinoIndicador = new VerticalIndicador();
                            $destinoIndicador->nome = $indicadorBase->nome;
                            $destinoIndicador->tipo = $indicadorBase->tipo;
                            $destinoIndicador->estrutura_id = $destinoEstrutura->id;
                            $destinoIndicador->taxa_substituicao = $indicadorBase->taxa_substituicao;
                            $destinoIndicador->obrigatorio = $indicadorBase->obrigatorio;
                            $destinoIndicador->ordem = $indicadorBase->ordem ? $indicadorBase->ordem : $ordemIndicador + 1;
                            $destinoIndicador->status = VerticalIndicador::ATIVO;
                            $destinoIndicador->created_by = Yii::$app->user->identity->id ?? null;
                            $destinoIndicador->created_at = date('Y-m-d H:i:s');
                            $destinoIndicador->cod_temp = $indicadorBase->id;
                            $destinoIndicador->conceito = $indicadorBase->conceito;

                            $destinoIndicador->usa_interpolacao = 0;
                            if ($indicadorBase->usa_interpolacao) {
                                $destinoIndicador->usa_interpolacao = 1;
                            }

                            if (!$destinoIndicador->save()) {

                                $texto = "ERRO ao salvar o indicador de destino " . $destinoIndicador->id . "', motivo: " . json_encode($destinoIndicador->getErrors()) . PHP_EOL;

                                throw new \yii\web\HttpException(500, $texto);
                            }

                            if ($indicadorBase->ordem) {
                                $ordemIndicador = $indicadorBase->ordem;
                            }

                            $alternativas = VerticalAlternativa::find()
                                    ->where([
                                        'indicador_id' => $indicadorBase->id,
                                        'status' => VerticalAlternativa::ATIVO,
                                    ])
                                    ->all();

                            if ($alternativas) {

                                foreach ($alternativas as $alternativaBase) {

                                    if ($alternativaBase->status == VerticalAlternativa::ATIVO) {

                                        $destinoAlternativa = new VerticalAlternativa();
                                        $destinoAlternativa->nome = $alternativaBase->nome;
                                        $destinoAlternativa->indicador_id = $destinoIndicador->id;
                                        $destinoAlternativa->peso = $alternativaBase->peso;
                                        $destinoAlternativa->ordem = $alternativaBase->ordem;
                                        $destinoAlternativa->nivel_esforco = $alternativaBase->nivel_esforco;
                                        $destinoAlternativa->nivel_referencia = $alternativaBase->nivel_referencia;
                                        $destinoAlternativa->nivel_referencia_bn = $alternativaBase->nivel_referencia_bn;
                                        $destinoAlternativa->status = VerticalAlternativa::ATIVO;
                                        $destinoAlternativa->created_by = Yii::$app->user->identity->id ?? null;
                                        $destinoAlternativa->created_at = date('Y-m-d H:i:s');
                                        $destinoAlternativa->cod_temp = $alternativaBase->id;
                                        $destinoAlternativa->interpolacao_absoluto = $alternativaBase->interpolacao_absoluto;

                                        if (!$destinoAlternativa->save()) {

                                            $texto = "ERRO ao salvar o as alternativas da vertical " . $destino->id . "', motivo: " . json_encode($destinoAlternativa->getErrors()) . PHP_EOL;

                                            throw new \yii\web\HttpException(500, $texto);
                                        }
                                    }
                                }
                            }

                            $parametros = VerticalIndicadorTemParametro::find()
                                    ->where([
                                        'vertical_indicador_id' => $indicadorBase->id,
                                        'status' => VerticalIndicadorTemParametro::ATIVO,
                                    ])
                                    ->all();

                            if ($parametros) {

                                foreach ($parametros as $parametrosBase) {

                                    if ($parametrosBase->status == VerticalIndicadorTemParametro::ATIVO) {

                                        $destinoParametro = new VerticalIndicadorTemParametro();
                                        $destinoParametro->vertical_indicador_id = $destinoIndicador->id;
                                        $destinoParametro->tipo = $parametrosBase->tipo;
                                        $destinoParametro->parametro = $parametrosBase->parametro;
                                        $destinoParametro->valor = $parametrosBase->valor;
                                        $destinoParametro->status = $parametrosBase->status;
                                        $destinoParametro->created_by = Yii::$app->user->identity->id ?? null;
                                        $destinoParametro->created_at = date('Y-m-d H:i:s');

                                        if (!$destinoParametro->save()) {

                                            $texto = "ERRO ao salvar o as os parametros do indicador da vertical " . $destino->id . "', motivo: " . json_encode($destinoParametro->getErrors()) . PHP_EOL;

                                            throw new \yii\web\HttpException(500, $texto);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }


        $estruturasCorrigir = VerticalEstrutura::find()->where(['vertical_id' => $destino->id])->all();

        foreach ($estruturasCorrigir as $eCorrigir) {

            if ($eCorrigir->cod_pai) {

                $pai = VerticalEstrutura::find()
                        ->where([
                            'cod_temp' => $eCorrigir->cod_pai,
                            'vertical_id' => $destino->id,
                        ])
                        ->one();

                if ($pai) {

                    $eCorrigir->cod_pai = $pai->id;
                    //$eCorrigir->cod_temp = null;

                    if (!$eCorrigir->save()) {
                        throw new \yii\web\HttpException(500, "Erro ao atualizar o cod_pai do item da Estrutura " . $eCorrigir->id . " , motivo:" . $eCorrigir->getErrors());
                    }
                }
            }
        }

        //VerticalIndicador::corrigiPai($destino->id);
        //VerticalAlternativa::corrigiPai($destino->id);

        $this->redirect('index');
    }

    public function actionVerticalIndicadorParametro($id) {

        \app\models\Base::loga("Acessou a vertical indicador parametro de Verticais", $_GET, $_POST);

        $this->layout = 'simples';

        if (Yii::$app->request->post()) {

            $valid = true;

            $connection = \Yii::$app->db;

            $transaction = $connection->beginTransaction();
            try {

                VerticalIndicadorParametro::deleteAll(['vertical_id' => $id]);


                $chavesParametro = max(array_keys($_POST['VerticalIndicadorTemParametro']['parametro']));

                for ($i = 0; $i <= $chavesParametro; $i++) {
                    if (
                            isset($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) && !empty($_POST['VerticalIndicadorTemParametro']['parametro'][$i])
                    ) {
                        $parametro = new VerticalIndicadorParametro();
                        $parametro->parametro = isset($_POST['VerticalIndicadorTemParametro']['parametro'][$i]) ? $_POST['VerticalIndicadorTemParametro']['parametro'][$i] : '';
                        $parametro->valor = isset($_POST['VerticalIndicadorTemParametro']['valor'][$i]) ? $_POST['VerticalIndicadorTemParametro']['valor'][$i] : '';
                        $parametro->vertical_id = $id;

                        if (!$parametro->save()) {
                            throw new HttpException(500, "Erro ao salvar o parâmetro padrão, motivo: " . json_encode($parametro->getErrors()));
                        }
                    }
                }

                if ($valid) {

                    $transaction->commit();

                    return $this->redirect(['view', 'id' => $id]);
                } else {

                    $transaction->rollback();
                }
            } catch (Exception $e) {
                $transaction->rollback();
            }
        }

        $model = new VerticalIndicadorParametro();

        $models = VerticalIndicadorParametro::find()
                ->where([
                    'vertical_id' => $id,
                ])
                ->all();

        return $this->render('_vertical_indicador_parametro', [
                    'model' => $model,
                    'models' => $models,
        ]);
    }

    public function actionDuplicaCluster($id) {

        \app\models\Base::loga("Acessou a duplicação de cluster da Vertical", $_GET, $_POST);

        $this->layout = '//empty';

        $valid = true;
        $msg = '';

        $tipo = substr($id, 0, 1);

        if (!in_array($tipo, ['I', 'A'])) {
            $tipo = 'E';
        }

        if ($tipo == 'E') {

            $connection = \Yii::$app->db;

            $transaction = $connection->beginTransaction();

            try {

                $atualizar = [];

                $item = substr($id, 1);

                //estrutura referencia base
                $base = VerticalEstrutura::findOne($item);

                //estrutura nova igual a referencia
                $destinoEstrutura = new VerticalEstrutura();
                $destinoEstrutura->nome = ($base->nome ?? null) . ' (duplicado)';
                $destinoEstrutura->cod_pai = $base->cod_pai ?? null;
                $destinoEstrutura->ordem = ($base->ordem ?? null) + 1;
                $destinoEstrutura->tipo_estrutura = $base->tipo_estrutura ?? null;
                $destinoEstrutura->nome_reduzido = $base->nome_reduzido ?? null;
                $destinoEstrutura->vertical_id = $base->vertical_id ?? null;
                $destinoEstrutura->taxa_substituicao = $base->taxa_substituicao ?? null;
                $destinoEstrutura->status = $base->status ?? null;
                $destinoEstrutura->created_by = \Yii::$app->user->identity->id ?? null;
                $destinoEstrutura->created_at = date('Y-m-d H:i:s');
                $destinoEstrutura->cod_temp = ($base->id ?? null) . 'x';

                if (!$destinoEstrutura->save()) {
                    $valid = false;
                    $msg .= "1 - Erro ao salvar o item, motivo: " . json_encode($destinoEstrutura->getErrors());
                }

                $estrutura = [];

                $existe = [];
                $existe[] = $base->id ?? null;

                $codPai = [];
                $codPai[] = $base->id ?? null;

                $continua = true;


                if ($valid) {
                    while ($continua) {


                        if ($valid) {
                            //buscando todas as estruturas filhas de referencia base em todos os niveis               
                            $estruturasBase = VerticalEstrutura::find()
                                    ->where(['status' => VerticalEstrutura::ATIVO])
                                    ->andWhere(['in', 'cod_pai', $codPai])
                                    ->andwhere(['not in', 'id', $existe])
                                    ->all();
                        }
                        //se possui estruturas filhas continua pesquisando novos filhos
                        if ($valid) {
                            if ($estruturasBase) {

                                foreach ($estruturasBase as $eb) {

                                    //simplificando os dados das estruturas filhas
                                    $novaEstrutura = [];
                                    $novaEstrutura['nome'] = $eb->nome;
                                    $novaEstrutura['cod_pai'] = $eb->cod_pai . 'x';
                                    $novaEstrutura['ordem'] = $eb->ordem;
                                    $novaEstrutura['tipo_estrutura'] = $eb->tipo_estrutura;
                                    $novaEstrutura['nome_reduzido'] = $eb->nome_reduzido;
                                    $novaEstrutura['vertical_id'] = $eb->vertical_id;
                                    $novaEstrutura['taxa_substituicao'] = $eb->taxa_substituicao;
                                    $novaEstrutura['status'] = $eb->status;
                                    $novaEstrutura['cod_temp'] = $eb->id . 'x';

                                    $estrutura[] = $novaEstrutura;

                                    $codPai[] = $eb->id;
                                    $existe[] = $eb->id;
                                }
                            } else {

                                //não encontrou filhos para a pesquisa
                                $continua = false;
                            }
                        }
                    }
                }

                //gerando as filhas da estrutura nova
                if ($valid) {
                    foreach ($estrutura as $nova) {

                        $itemEstrutura = new VerticalEstrutura();
                        $itemEstrutura->nome = $nova['nome'];
                        $itemEstrutura->cod_pai = $nova['cod_pai'];
                        $itemEstrutura->ordem = $nova['ordem'];
                        $itemEstrutura->tipo_estrutura = $nova['tipo_estrutura'];
                        $itemEstrutura->nome_reduzido = $nova['nome_reduzido'];
                        $itemEstrutura->vertical_id = $nova['vertical_id'];
                        $itemEstrutura->taxa_substituicao = $nova['taxa_substituicao'];
                        $itemEstrutura->status = $nova['status'];
                        $itemEstrutura->created_by = Yii::$app->user->identity->id ?? null;
                        $itemEstrutura->created_at = date('Y-m-d- H:i:s');
                        $itemEstrutura->cod_temp = $nova['cod_temp'];

                        if (!$itemEstrutura->save()) {
                            $valid = false;
                            $msg .= "2 - Erro ao salvar o novo item, motivo: " . json_encode($itemEstrutura->getErrors());
                        } else {
                            //armazenando os ids que precisa corrigir o pai
                            $atualizar[] = $itemEstrutura->id;
                        }
                    }
                }


                //estruturas recem criadas mas que precisam de ajuste do pai
                if ($valid) {
                    foreach ($atualizar as $novo) {
                        $item = VerticalEstrutura::findOne($novo);

                        if ($item->cod_pai == $base->id . 'x') {
                            $item->cod_pai = $destinoEstrutura->id;
                        } else {

                            $paiCerto = VerticalEstrutura::find()
                                    ->where([
                                        'cod_temp' => $item->cod_pai,
                                        'vertical_id' => $item->vertical_id,
                                        'status' => 1,
                                    ])
                                    ->one();

                            if ($paiCerto) {
                                $item->cod_pai = $paiCerto->id;
                            } else {
                                $valid = false;
                                $msg .= "3 - Erro ao encontrar o pai do novo item, motivo: pai não encontrado em " . json_encode($item);
                            }
                        }

                        if (!$item->save()) {
                            $valid = false;
                            $msg .= "4 - Erro ao atualizar o novo item, motivo: " . json_encode($item->getErrors());
                        }
                    }
                }

                //indicadores
                if ($valid) {
                    $indicadoresBase = VerticalIndicador::find()
                            ->where(['status' => 1])
                            ->andWhere(['in', 'estrutura_id', $codPai])
                            ->all();


                    $indicadores = [];
                    $codIndicadores = [];

                    foreach ($indicadoresBase as $indicadorBase) {

                        $indicadorTemp = [];
                        $indicadorTemp['nome'] = $indicadorBase->nome;
                        $indicadorTemp['estrutura_id'] = $indicadorBase->estrutura_id . 'x';
                        $indicadorTemp['tipo'] = $indicadorBase->tipo;
                        $indicadorTemp['taxa_substituicao'] = $indicadorBase->taxa_substituicao;
                        $indicadorTemp['obrigatorio'] = $indicadorBase->obrigatorio;
                        $indicadorTemp['ordem'] = $indicadorBase->ordem;
                        $indicadorTemp['status'] = $indicadorBase->status;
                        $indicadorTemp['created_by'] = Yii::$app->user->identity->id ?? null;
                        $indicadorTemp['created_at'] = date('Y-m-d H:i:s');
                        $indicadorTemp['cod_temp'] = $indicadorBase->id;
                        $indicadorTemp['conceito'] = $indicadorBase->conceito;
                        $indicadorTemp['usa_interpolacao'] = $indicadorBase->usa_interpolacao;

                        $indicadores[] = $indicadorTemp;
                        $codIndicadores[] = $indicadorBase->id;
                    }
                }


                //cadastrando novos indicadores       
                if ($valid) {
                    $atualizarIndicador = [];
                    foreach ($indicadores as $indicador) {

                        $estruturaIndicador = VerticalEstrutura::find()
                                ->where([
                                    'cod_temp' => $indicador['estrutura_id'],
                                    'status' => 1,
                                ])
                                ->one();

                        if (!$estruturaIndicador) {
                            $valid = false;
                            $msg .= "5  - Erro ao atualizar o a estrutura_id do indicador, motivo: " . json_encode($indicador);
                        }

                        if ($valid) {
                            $indicadorNovo = new VerticalIndicador();
                            $indicadorNovo->nome = $indicador['nome'];
                            $indicadorNovo->estrutura_id = $estruturaIndicador->id;
                            $indicadorNovo->tipo = $indicador['tipo'];
                            $indicadorNovo->taxa_substituicao = $indicador['taxa_substituicao'];
                            $indicadorNovo->obrigatorio = $indicador['obrigatorio'];
                            $indicadorNovo->ordem = $indicador['ordem'];
                            $indicadorNovo->status = $indicador['status'];
                            $indicadorNovo->created_by = $indicador['created_by'];
                            $indicadorNovo->created_at = $indicador['created_at'];
                            $indicadorNovo->cod_temp = $indicador['cod_temp'];
                            $indicadorNovo->conceito = $indicador['conceito'];
                            $indicadorNovo->usa_interpolacao = $indicador['usa_interpolacao'];

                            if (!$indicadorNovo->save()) {
                                $valid = false;
                                $msg .= "6 - Erro ao salvar o indicador novo, motivo: " . json_encode($indicadorNovo->getErrors());
                            } else {

                                $texto = 'Foi criado o indicador ' . $indicadorNovo->id . ' - "' . $indicadorNovo->nome . '" na vertical ' . $indicadorNovo->estrutura->vertical->nome . ' as ' . date('d/m/Y H:i');

//                                $email = \Yii::$app->mailer->compose('@app/mail/message', [
//                                            'content' => $texto,
//                                        ])
//                                        ->setFrom('no-reply@krinom.com.br')
//                                        ->setSubject('Indicador adicionado na vertical ' . $indicadorNovo->estrutura->vertical->nome)
//                                        ->send();

                                $atualizarIndicador[] = $indicadorNovo->id;
                            }
                        }
                    }
                }

                //alternativas
                if ($valid) {
                    $alternativasBase = VerticalAlternativa::find()
                            ->where([
                                'indicador_id' => $codIndicadores,
                                'status' => 1
                            ])
                            ->all();

                    //cadastrando as novas alternativas
                    $atualizarAlternativa = [];
                    foreach ($alternativasBase as $alternativa) {
                        if ($valid) {

                            $indicadorEstrutura = VerticalIndicador::find()
                                    ->where([
                                        'cod_temp' => $alternativa->indicador_id,
                                        'status' => 1
                                    ])
                                    ->one();

                            if (!$indicadorEstrutura) {
                                $valid = false;
                                $msg .= "7 - Erro ao atualizar o indicador_id da estrutura, motivo: " . json_encode($alternativa);
                            }

                            if ($valid) {
                                $alternativaNova = new VerticalAlternativa();
                                $alternativaNova->nome = $alternativa->nome;
                                $alternativaNova->status = $alternativa->status;
                                $alternativaNova->indicador_id = $indicadorEstrutura->id;
                                $alternativaNova->peso = $alternativa->peso;
                                $alternativaNova->ordem = $alternativa->ordem;
                                $alternativaNova->nivel_esforco = $alternativa->nivel_esforco;
                                $alternativaNova->nivel_referencia = $alternativa->nivel_referencia;
                                $alternativaNova->nivel_referencia_bn = $alternativa->nivel_referencia_bn;
                                $alternativaNova->cod_temp = $alternativa->cod_temp;
                                $alternativaNova->created_by = Yii::$app->user->identity->id ?? null;
                                $alternativaNova->created_at = date('Y-m-d H:i:s');
                                $alternativaNova->interpolacao_absoluto = $alternativa->interpolacao_absoluto;

                                if (!$alternativaNova->save()) {
                                    $valid = false;
                                    $msg .= "8 - Erro ao salvar a alternativa novo, motivo: " . json_encode($alternativaNova->getErrors());
                                }

                                $atualizarAlternativa[] = $alternativaNova->id;
                            }
                        }
                    }
                }

                //parametros
                if ($valid) {
                    $parametrosBase = VerticalIndicadorTemParametro::find()
                            ->where([
                                'vertical_indicador_id' => $codIndicadores,
                                'status' => 1
                            ])
                            ->all();

                    //cadastrando os novos parametros            
                    foreach ($parametrosBase as $parametro) {
                        if ($valid) {
                            $indicadorEstrutura = VerticalIndicador::find()
                                    ->where([
                                        'cod_temp' => $parametro->vertical_indicador_id,
                                        'status' => 1
                                    ])
                                    ->one();

                            if (!$indicadorEstrutura) {
                                $valid = false;
                                $msg .= "9 - Erro ao atualizar o vertical_indicador_id da estrutura, motivo: " . json_encode($alternativa);
                            }

                            if ($valid) {
                                $parametroNovo = new VerticalIndicadorTemParametro();
                                $parametroNovo->vertical_indicador_id = $indicadorEstrutura->id;
                                $parametroNovo->tipo = $parametro->tipo;
                                $parametroNovo->parametro = $parametro->parametro;
                                $parametroNovo->valor = $parametro->valor;
                                $parametroNovo->status = $parametro->status;
                                $parametroNovo->created_by = Yii::$app->user->identity->id ?? null;
                                $parametroNovo->created_at = date('Y-m-d H:i:s');

                                if (!$parametroNovo->save()) {
                                    $valid = false;
                                    $msg .= "10 - Erro ao salvar o parametro novo, motivo: " . json_encode($parametroNovo->getErrors());
                                }
                            }
                        }
                    }
                }


                if ($valid) {

                    $atualizar[] = $destinoEstrutura->id;

                    //limpar cod_temp da estrutura criada
                    foreach ($atualizar as $editar) {
                        if ($valid) {
                            $itemEstrutura = VerticalEstrutura::findOne($editar);
                            $itemEstrutura->cod_temp = null;
                            if (!$itemEstrutura->save()) {
                                $valid = false;
                                $msg .= "11 - Erro ao remover o cod_temp da estrutura, motivo: " . json_encode($itemEstrutura->getErrors());
                            }
                        }
                    }
                }

                //limpar cod_temp do indicador criada
                if ($valid) {
                    foreach ($atualizarIndicador as $editarIndicador) {
                        if ($valid) {
                            $itemIndicador = VerticalIndicador::findOne($editarIndicador);
                            $itemIndicador->cod_temp = null;
                            if (!$itemIndicador->save()) {
                                $valid = false;
                                $msg .= "12 - Erro ao remover o cod_temp do indicador, motivo: " . json_encode($itemIndicador->getErrors());
                            }
                        }
                    }
                }

                //limpar cod_temp da alternativa criada
                if ($valid) {
                    foreach ($atualizarAlternativa as $editarAlternativa) {
                        if ($valid) {
                            $itemAlternativa = VerticalAlternativa::findOne($editarAlternativa);
                            $itemAlternativa->cod_temp = null;
                            if (!$itemAlternativa->save()) {
                                $valid = false;
                                $msg .= "13 - Erro ao remover o cod_temp da alternativa, motivo: " . json_encode($itemAlternativa->getErrors());
                            }
                        }
                    }
                }

                if ($valid) {
                    $transaction->commit();

                    Yii::$app->getSession()->setFlash('success', 'Item duplicdo com sucesso!');

                    return $this->redirect(['/performance/vertical/view', 'id' => $base->vertical_id]);
                } else {
                    $transaction->rollback();

                    return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Erro ao duplicar o item, motivo: " . $msg . "</div></div></div>";
                }
            } catch (Exception $e) {
                $transaction->rollback();

                return "<div class='row-fluid'><div class='col-lg-12 col-md-12 col-sm-12'><div class='alert alert-danger'>Erro ao duplicar o item, motivo: " . $e->getMessage() . "</div></div></div>";
            }
        }
    }

    public function actionListaGrupo($q = null, $indicador = null, $id = null) {
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        $out = ['results' => ['id' => '', 'nome' => '']];
        if (!is_null($q)) {

            $verticalId = null;
            if ($indicador) {
                $verticalId = Vertical::find()
                        ->select('vertical.id')
                        ->join('INNER JOIN', 'vertical_estrutura', 'vertical_estrutura.vertical_id=vertical.id')
                        ->join('INNER JOIN', 'vertical_indicador', 'vertical_indicador.estrutura_id=vertical_estrutura.id')
                        ->where(['vertical_indicador.id' => $indicador])
                        ->one();
            }

            $query = new \yii\db\Query;
            $query->select('id, nome')
                    ->from('vertical_grupo')
                    ->where(['vertical_id' => $verticalId])
                    ->andWhere(['like', 'nome', $q]);

            $command = $query->createCommand();
            $data = $command->queryAll();

            if (empty($data)) {
                $out['results'] = [['id' => $q, 'nome' => $q]];
            } else {
                $out['results'] = array_values($data);
            }
        } elseif ((float) $id > 0) {
            $out['results'] = ['id' => $id, 'nome' => \app\modules\performance\models\VerticalGrupo::find($id)->nome];
        }
        return $out;
    }

}
