<?php

namespace app\modules\performance\controllers;

ini_set("memory_limit", "-1");

use Yii;
use app\modules\performance\models\Coleta;
use app\modules\performance\models\ColetaSearch;
use app\modules\performance\models\ColetaEstrutura;
use app\modules\performance\models\ColetaIndicador;
use app\modules\performance\models\ColetaAlternativa;
use app\modules\performance\models\Projeto;
use app\modules\performance\models\Contexto;
use app\modules\performance\models\Vertical;
use app\modules\performance\models\VerticalEstrutura;
use app\modules\performance\models\VerticalIndicador;
use app\modules\performance\models\VerticalAlternativa;
use app\modules\performance\models\Timeline;
use app\modules\performance\models\Aplicacao;
use app\modules\performance\models\AplicacaoTemProjeto;
use app\models\GenericSearch;
use app\controllers\BaseController;
use yii\web\NotFoundHttpException;
use yii\web\HttpException;
use yii\filters\VerbFilter;
use yii\helpers\ArrayHelper;
use app\components\Utils;
use app\models\InventarioScope;
use app\modules\performance\models\ProjetoTemVertical;
use yii\helpers\Json;
use app\modules\performance\models\RiscoCenario;
use app\modules\performance\models\Risco;
use yii\helpers\Html;
use \Exception;

/**
 * ColetaController implements the CRUD actions for Coleta model.
 */
class ColetaController extends BaseController
{

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

    /**
     * Lists all Coleta models.
     * @return mixed
     */
    public function actionIndex()
    {

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

        \app\models\Base::loga("Acessou a lista de Coletas", $_GET, $_POST, 35);

        $searchModel = new ColetaSearch();

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

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

        if (Yii::$app->request->isAjax) {
            Yii::$app->assetManager->bundles = ['yii\web\JqueryAsset' => false];
        }

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

    /**
     * Displays a single Coleta model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id, $contexto = null, $aplicacao = null, $layout = null)
    {

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

        \app\models\Base::loga("Acessou a visualização de Coleta", $_GET, $_POST, 36);

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

        $meusContextos = GenericSearch::filterMyContextos()
            ->query
            ->select('id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->column();

        if (!in_array($model->contexto_id, $meusContextos)) {
            throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
        }

        if ($model->status == Coleta::INTERROMPIDA) {
            $this->redirect(['interrompida', 'id' => $model->id])->send();
        }

        if (isset($_GET['recalcula'])) {
            Coleta::geraPontuacao($model);
        }

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }


        $extras = null;

        if (isset($_GET["extras"])) {
            $extras = true;
        }

        $estrutura = Coleta::estrutura($model, $extras, 'default', $model->faixasPadrao);

        if (isset($_GET['debugvar'])) {
            Utils::debug(${$_GET['debugvar']});
        }

        if ($layout == 'contexto') {

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

            $contexto = Contexto::findOne($contexto);

            if (!$contexto) {
                return '<div class="alert alert-danger">Erro! Cliente não encontrado!</div>';
            }

            $aplicacao = \app\modules\performance\models\Aplicacao::findOne($aplicacao);

            if (!$aplicacao) {
                return '<div class="alert alert-danger">Erro! Aplicação não encontrada!</div>';
            }

            $tarefasAtrasadas = \app\modules\performance\models\Tarefa::find()
                ->join('LEFT JOIN', 'pa_acao_proposta', 'pa_acao_proposta.id=pa_tarefa.pa_acao_proposta_id')
                ->join('LEFT JOIN', 'pa_plano_acao', 'pa_plano_acao.id=pa_acao_proposta.pa_plano_acao_id')
                ->where([
                    'pa_plano_acao.contexto_id' => $contexto->id,
                    'pa_acao_proposta.status' => \app\modules\performance\models\PlanoAcao::ATIVO,
                    'pa_plano_acao.status' => \app\modules\performance\models\AcaoProposta::ATIVO,
                ])
                ->andWhere(['<', 'pa_tarefa.termino_previsto', date('Y-m-d')])
                ->andWhere(['!=', 'pa_tarefa.situacao', \app\modules\performance\models\Tarefa::SITUACAO_ENCERRADA])
                ->orderBy('pa_plano_acao_id ASC, pa_tarefa.termino_previsto ASC, pa_tarefa.id ASC')
                ->all();

            $totalNotificacoes = count($tarefasAtrasadas);

            $permiteEditar = true;

            $ultimasAtualizacoes = \app\models\Log::find()
                ->where([
                    'contexto_id' => $contexto->id,
                ])
                ->andWhere(['!=', 'mensagem', 'Acessou a visualização de Contexto'])
                ->orderBy('id DESC')
                ->limit(10)
                ->all();

            return $this->render('view_contexto', [
                'contexto' => $contexto,
                'aplicacao' => $aplicacao,
                'totalNotificacoes' => $totalNotificacoes,
                'permiteEditar' => $permiteEditar,
                'ultimasAtualizacoes' => $ultimasAtualizacoes,
                'model' => $model,
                'estrutura' => $estrutura,
            ]);
        }

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

    /**
     * Creates a new Coleta model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate($contexto = null, $aplicacao = null)
    {


        $this->redirect(['lgpd-create', 'contexto' => $contexto, 'aplicacao' => $aplicacao])->send();

        exit();
        \app\models\Base::loga("Acessou a criação de Coleta", $_GET, $_POST, 37, $contexto);

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

        $model = new Coleta();

        $meusContextos = GenericSearch::filterMyContextosAuditor()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();

        if ($contexto) {
            if (!$isCeon) {
                $contextosPermitidos = [];
                foreach ($meusContextos as $meuContexto) {
                    $contextosPermitidos[] = $meuContexto->id;
                }
                if (!in_array($contexto, $contextosPermitidos)) {
                    throw new HttpException(403, "Cliente não permitido para seu usuário");
                }
            }

            $model->contexto_id = $contexto;
            $model->vertical_id = Vertical::PADRAO_LGPD;

            $projetoBase = Projeto::find()
                ->joinWith('projetoTemVerticals')
                ->where([
                    'projeto_tem_vertical.vertical_id' => Vertical::PADRAO_LGPD,
                    'projeto_tem_vertical.status' => Vertical::ATIVO,
                    'projeto.status' => Projeto::ATIVO,
                ])
                ->andWhere(['like', 'contextos', ',' . $contexto])
                ->one();
            if ($projetoBase) {
                $model->projeto_id = $projetoBase->id;
            }


            if (!$model->contexto->acessoTemporarioLiberado) {
                throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
            }
        }

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

        $model->status = Coleta::ATIVO;

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

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

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

            //Utils::debug($_POST);

            $valid = true;

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

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

                //salvando a coleta
                if ($valid) {
                    if (!$model->save()) {
                        $valid = false;
                        throw new HttpException(500, "E1 - Erro ao salvar a coleta, motivo: " . json_encode($model->getErrors()));
                    }
                }

                //salvando a estrutura
                if ($valid) {

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

                    if (!$verticalBase) {
                        $valid = false;
                        throw new HttpException(500, "E2 - Erro ao buscar a vertical base  da coleta");
                    }
                }

                if ($valid) {
                    $valid = Coleta::criaEstruturaIndicadorAlternativa($model, $verticalBase, $_POST);
                }

                //corrigir pai
                if ($valid) {
                    $valid = Coleta::corrigiPai($model);
                }

                //preencher
                //execute não retorna true -> pesquisar
                if ($valid) {
                    Coleta::populaIndicadores($model, $_POST);
                }

                //corrigir taxa lista
                if ($valid) {
                    $valid = Coleta::corrigiTaxaLista($model);
                }

                //gerar pontuacao
                if ($valid) {
                    $valid = Coleta::geraPontuacao($model);
                }

                //atualizando pontuacao do Contexto
                if ($valid) {
                    Contexto::geraPontuacao($model->contexto);
                }

                //atualizando pontuacao da Estrutura do Contexto
                if ($valid) {
                    Contexto::geraPontuacaoEstrutura($model->contexto);
                }

                //reorganizar indicadores 
                if ($valid) {
                    $valid = Coleta::estruturaOrdenar($model);
                }

                //atualizando dados da Aplicacao
                $aplicacao = null;

                $aplicacaoTemProjeto = \app\modules\performance\models\AplicacaoTemProjeto::find()
                    ->join('LEFT JOIN', 'projeto', 'projeto.id=aplicacao_tem_projeto.projeto_id')
                    ->where([
                        'aplicacao_tem_projeto.projeto_id' => $model->projeto_id,
                        'projeto.vertical_id' => $model->vertical_id,
                    ])
                    ->one();

                if ($aplicacaoTemProjeto) {
                    $aplicacao = \app\modules\performance\models\Aplicacao::findOne($aplicacaoTemProjeto->aplicacao_id);
                    $valid = \app\modules\performance\models\Aplicacao::atualizaDadosAplicacao($aplicacao);
                } else {

                    $aplicacoes = \app\modules\performance\models\Aplicacao::find()
                        ->join('LEFT JOIN', 'unidade_negocio', 'unidade_negocio.id=aplicacao.unidade_negocio_id')
                        ->where([
                            'unidade_negocio.cliente_id' => $model->contexto->cliente_id,
                            'aplicacao.status' => \app\modules\performance\models\Aplicacao::ATIVO,
                            'unidade_negocio.status' => \app\modules\performance\models\UnidadeNegocio::ATIVO,
                        ])
                        ->all();

                    foreach ($aplicacoes as $aplicacao) {
                        if ($valid) {
                            $valid = \app\modules\performance\models\Aplicacao::atualizaDadosAplicacao($aplicacao);
                        }
                    }
                }

                if ($valid) {
                    //                    $timeLine = new Timeline();
                    //                    $timeLine->tipo = Timeline::TIPO_CONTEXTO;
                    //                    $timeLine->vinculo = $model->contexto_id;
                    //                    $timeLine->data_cadastro = date('Y-m-d H:i:s');
                    //                    $timeLine->icone = Timeline::ICONE_COLETA_CADASTRADA;
                    //                    $timeLine->cadastrado_por = Yii::$app->user->identity->id ?? null;
                    //                    $timeLine->cadastrado_nome = Yii::$app->user->identity->nome;
                    //                    $timeLine->titulo = 'realizou uma coleta';
                    //                    $timeLine->conteudo = 'Realizou a coleta ' . $model->id;
                    //                    $timeLine->status = Timeline::ATIVO;
                    //
                    //                    if (!$timeLine->save()) {
                    //                        $valid = false;
                    //                        throw new ErrorException("Erro ao salvar a timeline, entre em contato com o suporte");
                    //                    }
                }

                $model->save();
                $transaction->commit();

                if ($contexto && $aplicacao) {
                    $url = ['/performance/contexto/view', 'id' => $contexto, 'aplicacao_id' => $aplicacao->id];
                    return $this->redirect($url)->send();
                } else {
                    return $this->redirect(['view', 'id' => $model->id]);
                }
            } catch (Exception $e) {
                $transaction->rollback();
                throw new HttpException(500, $e->getMessage());
            }
        }

        $clientesMeusContextos = [];

        $projetosMeusContextos = [];

        foreach ($meusContextos as $meuContexto) {

            $clientesMeusContextos[] = $meuContexto->cliente_id;

            $projetosMeusContextos = array_merge($projetosMeusContextos, Projeto::find()
                ->select('id')
                ->where(['status' => Projeto::ATIVO])
                ->andWhere([
                    'or',
                    ['like', 'contextos', $meuContexto->id . ','],
                    ['like', 'contextos', ',' . $meuContexto->id],
                    ['=', 'contextos', $meuContexto->id],
                ])
                ->column());
        }


        $projetosMeusContextos = array_merge($projetosMeusContextos, Projeto::find()
            ->select('id')
            ->where([
                'status' => Projeto::ATIVO,
                'contextos' => '*,',
            ])
            ->andWhere(['in', 'cliente_id', $clientesMeusContextos])
            ->column());


        $projetos = ArrayHelper::map(Projeto::find()
            ->where(['status' => Projeto::ATIVO])
            ->andWhere(['in', 'id', $projetosMeusContextos])
            ->orderBy('id DESC')
            ->all(), 'id', 'clienteNome');

        if ($contexto) {
            $contextoModel = Contexto::findOne($contexto);
            if (!$contextoModel) {
                throw new HttpException(500, "Cliente não encontrado");
            }
        } else {
            $contextoModel = new Contexto();
        }

        $isCeon = \app\components\Logged::isCeon();

        $permissaoContextoGestor = \app\models\UserHasResource::find()
            ->where([
                //    'resource_id' => $contexto->id,
                'user_id' => Yii::$app->user->identity->id,
                'role' => \app\models\UserHasResource::NV_CP_CONTEXTO_ADM,
            ])
            ->one();

        $permissaoClienteGestor = \app\models\UserHasResource::find()
            ->where([
                //    'resource_id' => $contexto->id,
                'user_id' => Yii::$app->user->identity->id,
                'role' => \app\models\UserHasResource::NV_CP_CLIENTE_ADM,
            ])
            ->one();

        if ($permissaoContextoGestor || $permissaoClienteGestor || $isCeon) {
            $avisaPendencia = true;
            $botoes = true;
            $permiteEditar = true;
        } else {
            $avisaPendencia = false;
            $botoes = false;
            $permiteEditar = false;
        }

        $tarefasAtrasadas = \app\modules\performance\models\Tarefa::find()
            ->join('LEFT JOIN', 'pa_acao_proposta', 'pa_acao_proposta.id=pa_tarefa.pa_acao_proposta_id')
            ->join('LEFT JOIN', 'pa_plano_acao', 'pa_plano_acao.id=pa_acao_proposta.pa_plano_acao_id')
            ->join('LEFT JOIN', 'contexto', 'contexto.id=pa_plano_acao.contexto_id')
            ->join('LEFT JOIN', 'user_has_resource', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'contexto.id' => $contextoModel->id ?? null,
                'pa_acao_proposta.status' => \app\modules\performance\models\PlanoAcao::ATIVO,
                'pa_plano_acao.status' => \app\modules\performance\models\AcaoProposta::ATIVO,
                'contexto.active' => \app\modules\performance\models\Contexto::ATIVO,
            ])
            ->andWhere(['<', 'pa_tarefa.termino_previsto', date('Y-m-d')])
            ->andWhere(['!=', 'pa_tarefa.situacao', \app\modules\performance\models\Tarefa::SITUACAO_ENCERRADA])
            ->orderBy('pa_plano_acao_id ASC, pa_tarefa.termino_previsto ASC, pa_tarefa.id ASC')
            ->all();

        $totalNotificacoes = count($tarefasAtrasadas);

        $ultimasAtualizacoes = \app\models\Log::find()
            ->where([
                'contexto_id' => $contextoModel->id ?? null,
            ])
            ->andWhere(['!=', 'mensagem', 'Acessou a visualização de Contexto'])
            ->orderBy('id DESC')
            ->limit(10)
            ->all();

        $logo = \app\models\BaseModel::logo();

        return $this->render('create', [
            'model' => $model,
            'projetos' => $projetos,
            'contextoModel' => $contextoModel,
            'aplicacao' => $aplicacao,
            'isCeon' => $isCeon,
            'permiteEditar' => $permiteEditar,
            'totalNotificacoes' => $totalNotificacoes,
            'ultimasAtualizacoes' => $ultimasAtualizacoes,
            'logo' => $logo,
        ]);
    }

    /**
     * Updates an existing Coleta 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)
    {

        return false;
        //    \app\modules\performance\models\Base::loga("Acessou a atualização da Coleta", $_GET, $_POST);

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

        if (isset($_SESSION['isAdmin'])) {
            if ($_SESSION['isAdmin'] == true) {

                $projetos = ArrayHelper::map(\app\modules\performance\models\Projeto::find()
                    ->where([
                        'status' => Projeto::ATIVO,
                    ])
                    ->orderBy('id DESC')
                    ->all(), 'id', 'clienteNome');
            }
        }

        if (isset($_SESSION['isCliente'])) {
            if (!in_array($model->contexto->cliente_id, $_SESSION['isCliente'])) {
                throw new HttpException(500, "Erro! Contexto da coleta não pertence a seu escopo");
            }

            $projetos = ArrayHelper::map(Projeto::find()
                ->where([
                    'status' => Projeto::ATIVO,
                    'vertical_id' => $model->projeto->vertical_id,
                ])
                ->andWhere(['in', 'cliente_id', $_SESSION['isCliente']])
                ->orderBy('id DESC')
                ->all(), 'id', 'clienteNome');
        }

        if (isset($_SESSION['isCISI'])) {
            if (!in_array($model->contexto->cliente_id, $_SESSION['isCISI'])) {
                throw new HttpException(500, "Erro! Contexto da coleta não pertence a seu escopo");
            }

            $projetos = ArrayHelper::map(Projeto::find()
                ->where([
                    'status' => Projeto::ATIVO,
                    'vertical_id' => $model->projeto->vertical_id,
                ])
                ->andWhere(['in', 'cliente_id', $_SESSION['isCISI']])
                ->orderBy('id DESC')
                ->all(), 'id', 'clienteNome');
        }


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

            Contexto::geraPontuacao($model->contexto);

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



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

    /**
     * Deletes an existing Coleta 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, $origem = 1, $contexto = null, $aplicacao = null, $layout = null)
    {

        \app\models\Base::loga("Excluiu Coleta", $_GET, $_POST, 38);

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

        $meusContextos = GenericSearch::filterMyContextosAuditor()
            ->query
            ->select('id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->column();

        if (!in_array($model->contexto_id, $meusContextos)) {
            throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
        }

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $valid = true;

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

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

            //salvando a coleta

            $model->status = Coleta::INATIVO;

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

            //atualizando pontuacao do Contexto
            if ($valid) {
                $valid = Contexto::geraPontuacao($model->contexto);
            }

            //excluindo cenario de risco
            if ($valid) {
                $cenarios = \app\modules\performance\models\RiscoCenario::find()->where(['coleta_vinculo' => $id, 'status' => \app\modules\performance\models\RiscoCenario::ATIVO])->all();
                if ($cenarios) {
                    foreach ($cenarios as $cenario) {
                        if ($valid) {
                            $cenario->status = \app\modules\performance\models\RiscoCenario::INATIVO;
                            if (!$cenario->save()) {
                                $valid = false;
                                throw new HttpException(500, "E2 - Erro ao excluir a coleta, motivo: " . json_encode($cenario->getErrors()));
                            }
                        }
                    }
                }
            }

            if ($valid) {

                $cenarioRiscos = \app\modules\risk\models\RiscoCenario::find()
                    ->where(['coleta_vinculo' => $model->id])
                    ->all();

                foreach ($cenarioRiscos as $cenarioRisco) {
                    $cenarioRisco->status = \app\modules\risk\models\RiscoCenario::INATIVO;
                    if (!$cenarioRisco->save()) {
                        $valid = false;
                        throw new HttpException(500, "Erro ao excluir o cenário de risco associado, motivo: " . json_encode($cenarioRisco->getErrors()));
                    }
                }

                $aplicacaoTemProjetos = \app\modules\performance\models\AplicacaoTemProjeto::find()
                    ->where([
                        'projeto_id' => $model->projeto_id ?? null,
                    ])
                    ->all();

                foreach ($aplicacaoTemProjetos as $aplicacaoTemProjeto) {
                    \app\modules\performance\models\Aplicacao::atualizaDadosAplicacao($aplicacaoTemProjeto->aplicacao);
                }

                $transaction->commit();

                if ($origem == 1) {
                    return true;
                } else {

                    if ($layout == 'contexto') {
                        $this->redirect(['contexto', 'contexto' => $contexto, 'aplicacao' => $aplicacao])->send();
                    }

                    $this->redirect('index');
                }
            }
        } catch (Exception $e) {
            $transaction->rollback();
            throw new HttpException(500, $e->getMessage());
        }
    }

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

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

    public function actionListaContextosPossiveis()
    {
        $out = [];
        if (isset($_POST['depdrop_parents'])) {
            $parents = $_POST['depdrop_parents'];
            if ($parents != null) {
                $projetoId = $parents[0];

                $projeto = Projeto::find()->where(['id' => $projetoId, 'status' => Projeto::ATIVO])->one();

                if (!$projeto) {
                    echo Json::encode(['output' => '', 'selected' => '']);
                    return;
                }

                if (isset($_SESSION['isCliente'])) {
                    if (!in_array($projeto->cliente_id, $_SESSION['isCliente'])) {
                        echo Json::encode(['output' => ['Projeto não pertence a seu escopo'], 'selected' => '']);
                        return;
                    }
                }

                $possiveis = explode(",", $projeto->contextos);

                if (in_array("*", $possiveis)) {
                    $list = Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'active', Contexto::ATIVO])->andWhere(['=', 'cliente_id', $projeto->cliente_id])->asArray()->all();
                } else {
                    $list = Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'active', Contexto::ATIVO])->andWhere(['in', 'id', $possiveis])->asArray()->all();
                }

                $selected = null;
                if ($projetoId != null && count($list) > 0) {

                    $selected = '';
                    foreach ($list as $i => $account) {
                        $out[] = ['id' => $account['id'], 'name' => $account['name']];
                        //                        if ($i == 0) {
                        //                            $selected = '*';
                        //                        }
                    }

                    //if (count($list) == 1) {
                    //    $selected = $list[0]['id'];
                    //}
                    //                    if (isset($_POST['depdrop_all_params'])) {
                    //
                    //                        $projeto = Projeto::findOne($_POST['depdrop_all_params']['projeto']);
                    //                        if ($projeto) {
                    //                            $selected = [];
                    //                            $c = explode(',', $projeto->contextos);
                    //                            foreach ($c as $ey => $value) {
                    //                                $selected[] = $value;
                    //                            }
                    //                        }
                    //                    }
                    // 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 actionBuscaEstrutura()
    {

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

            if (!isset($_POST["projeto"]) || !isset($_POST["contexto"])) {
                return "<div class='alert alert-danger'>Erro! Falta campo obrigatório, entre em contato com o suporte.</div>";
            }

            $projeto = Projeto::find()->where(['id' => (int) $_POST['projeto'], 'status' => Projeto::ATIVO])->one();

            if (!$projeto) {
                return "<div class='alert alert-danger'>Erro! Projeto não encontrado, entre em contato com o suporte.</div>";
            }

            $contextosPossiveis = explode(",", $projeto->contextos);

            if (!in_array("*", $contextosPossiveis)) {

                if (!in_array((int) $_POST['contexto'], $contextosPossiveis)) {
                    return "<div class='alert alert-danger'>Erro! Contexto não permitido para esse projeto não encontrado, entre em contato com o suporte.</div>";
                }
            }

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

            if (!$vertical) {
                return "<div class='alert alert-danger'>Erro! Vertical do projeto não encontrada, entre em contato com o suporte.</div>";
            }

            $estrutura = Vertical::estruturaForm($vertical);

            return $estrutura;
        }
    }

    public function actionBuscaEstruturaApp()
    {

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

            if (!isset($_POST["projeto"]) || !isset($_POST["vertical"]) || !isset($_POST["contexto"])) {
                return "<div class='alert alert-danger'>Erro! Falta campo obrigatório, entre em contato com o suporte.</div>";
            }

            $projeto = Projeto::find()->where(['id' => (int) $_POST['projeto'], 'status' => Projeto::ATIVO])->one();

            if (!$projeto) {
                return "<div class='alert alert-danger'>Erro! Projeto não encontrado, entre em contato com o suporte.</div>";
            }

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

            if (!$vertical) {
                return "<div class='alert alert-danger'>Erro! Vertical não encontrada, entre em contato com o suporte.</div>";
            }

            $contextosPossiveis = explode(",", $projeto->contextos);

            if (!in_array("*", $contextosPossiveis)) {

                if (!in_array((int) $_POST['contexto'], $contextosPossiveis)) {
                    return "<div class='alert alert-danger'>Erro! Contexto não permitido para esse projeto não encontrado, entre em contato com o suporte.</div>";
                }
            }

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

            if (!$vertical) {
                return "<div class='alert alert-danger'>Erro! Vertical do projeto não encontrada, entre em contato com o suporte.</div>";
            }

            $estrutura = Vertical::estruturaFormApp($vertical, $_POST['contexto']);

            return $estrutura;
        }
    }

    public function actionListaAreasPreocupacaoPossiveis()
    {

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

                $segurancaId = ColetaEstrutura::find()
                    ->where([
                        'coleta_id' => $coletaId,
                        'status' => Coleta::ATIVO,
                        'tipo_estrutura' => 'V',
                    ])
                    ->one();

                $list = [];
                if ($segurancaId) {
                    $list = ColetaEstrutura::find()
                        ->where([
                            'coleta_id' => $coletaId,
                            'status' => Coleta::ATIVO,
                            'cod_pai' => $segurancaId->id
                        ])
                        ->orderBy('ordem ASC, nome ASC')
                        ->all();
                }
                $selected = null;

                if ($coletaId != null && count($list) > 0) {
                    $selected = '';
                    foreach ($list as $account) {

                        $out[] = ['id' => $account->nome, 'name' => $account->nome];
                    }

                    if (isset($_POST['depdrop_all_params'])) {
                        if ($_POST['depdrop_all_params']['new'] == 'sim') {
                        } else {
                            $selected = [];

                            $coletaEstrutura = ColetaEstrutura::find()->where(['nome' => $_POST['depdrop_all_params']['area-preocupacao'], 'status' => ColetaEstrutura::ATIVO])->one();

                            if ($coletaEstrutura) {

                                $selected = $_POST['depdrop_all_params']['area-preocupacao'];
                            }
                        }
                    }
                    // Shows how you can preselect a value
                    echo Json::encode(['output' => $out, 'selected' => $selected]);
                    //   \Yii::$app->response->data = Json::encode(['output' => $out, 'selected' => $selected]);
                    return;
                    exit();
                }
                //echo Json::encode(['output' => $out, 'selected' => '']);
                \Yii::$app->response->data = Json::encode(['output' => $out, 'selected' => '']);
                return;
                exit();
            }
        }
        //echo Json::encode(['output' => '', 'selected' => '']);
        \Yii::$app->response->data = Json::encode(['output' => $out, 'selected' => '']);
        return;
        exit();
    }

    public function actionListaEstruturasPossiveis()
    {

        $this->layout = 'empty';
        $out = [];
        if (isset($_POST['depdrop_parents'])) {
            $parents = $_POST['depdrop_parents'];
            if ($parents != null) {
                $coletaId = $parents[0];

                $list = ColetaEstrutura::find()->where(['coleta_id' => $coletaId, 'status' => ColetaEstrutura::ATIVO])->all();
                $selected = null;
                if ($coletaId != null && count($list) > 0) {
                    $selected = '';
                    foreach ($list as $account) {

                        $out[] = ['id' => $account->id, 'name' => $account->nome];
                    }

                    if (isset($_POST['depdrop_all_params'])) {
                        if ($_POST['depdrop_all_params']['new'] == 'sim') {
                        } else {
                            $selected = [];

                            $estrutura = ColetaEstrutura::find()->where(['id' => $_POST['depdrop_all_params']['estrutura'], 'status' => ColetaEstrutura::ATIVO])->one();

                            if ($estrutura) {

                                $selected[] = $estrutura->id;
                            }
                        }
                    }
                    // Shows how you can preselect a value
                    //echo Json::encode(['output' => $out, 'selected' => $selected]);
                    \Yii::$app->response->data = Json::encode(['output' => $out, 'selected' => $selected]);
                    return;
                    exit();
                }
                echo Json::encode(['output' => $out, 'selected' => '']);
                return;
                exit();
            }
        }
        echo Json::encode(['output' => '', 'selected' => '']);
        return;
        exit();
    }

    public function actionRecalcular($id)
    {

        \app\models\Base::loga("Acessou o recálculo de Coleta", $_GET, $_POST, 39);

        $model = Coleta::findOne($id);

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        Coleta::geraPontuacao($model);

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

    public function actionGeraColetaOrsegups()
    {

        return false;
        $contextos = Contexto::find()->where('rgt-lft=1')->andWhere(['=', 'root', Contexto::ID_ORSEGUPS])->andWhere(['=', 'active', 1])->all();

        foreach ($contextos as $contexto) {

            $model = new Coleta();

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

            $model->status = Coleta::ATIVO;

            $model->created_by = 1;

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

            $json = file_get_contents('https://psec.iorsec.com/api/default/coleta?token=' . md5(date('Ymd')) . '&coleta=' . $duplica[1]);
            $obj = json_decode($json);

            if ($obj->status == "erro") {
                throw new HttpException(500, $obj->data->mensagem);
            }

            if (!isset($obj->data->dados[0])) {
                throw new HttpException(500, "Erro: coleta ainda não foi processada, entre em contato com o suporte");
            }
            $estruturaAPI = $obj->data->dados[0]->estrutura;

            $estrutura = [];

            foreach ($estruturaAPI as $itemAPI) {
                $estrutura[] = [
                    'id' => $itemAPI->id,
                    'parent' => $itemAPI->parent == "#" ? null : $itemAPI->parent,
                    'text' => $itemAPI->text,
                    'sotext' => $itemAPI->sotext,
                    'chave' => $itemAPI->chave,
                    'tipo' => $itemAPI->tipo,
                    'indicador' => $itemAPI->indicador,
                    'pontuacao' => $itemAPI->pontuacao,
                    'estrutura' => $itemAPI->estrutura,
                    'alternativas' => $itemAPI->alternativas,
                    'string_valor_escolhido' => $itemAPI->string_valor_escolhido,
                ];
            }

            //       $analitics = Analitics::find()->where(['COD_PSACOLETA' => $POST['Coleta']['duplica_id']])->asArray()->all();

            ColetaEstrutura::updateAll(['cod_temp' => null]);

            ColetaIndicador::updateAll(['cod_temp' => null]);

            ColetaAlternativa::updateAll(['cod_temp' => null]);

            $model->save();

            $codTempIndicador = [];

            $primeiraEstrutura = null;

            foreach ($estrutura as $key => $itemEstrutura) {

                if ($key == 0) {
                    $est = new ColetaEstrutura();
                    $est->nome = 'Segurança';
                    //$est->nome = $itemEstrutura['text'];
                    $est->cod_pai = null;
                    $est->tipo_estrutura = 'V';
                    $est->coleta_id = $model->id;
                    $est->taxa_substituicao = null;
                    $est->pontuacao = $itemEstrutura['pontuacao'];
                    $est->status = 1;
                    $est->created_by = \Yii::$app->user->identity->id ?? null;
                    $est->created_at = date('Y-m-d H:i:s');
                    $est->cod_temp = $itemEstrutura['id'];

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

                    if (!$primeiraEstrutura) {
                        $primeiraEstrutura = $est->id;
                    }
                } else {

                    if ($itemEstrutura['tipo'] == 'indicador') {



                        $ind = new ColetaIndicador();
                        $ind->nome = $itemEstrutura['sotext'];
                        $ind->estrutura_id = null;
                        $ind->tipo = (string) ColetaIndicador::TIPO_LISTA;
                        $ind->taxa_substituicao = null;
                        $ind->pontuacao = $itemEstrutura['pontuacao'];
                        $ind->string_valor_escolhido = $itemEstrutura['string_valor_escolhido'];
                        $ind->cod_temp = $itemEstrutura['parent'];
                        $ind->status = 1;
                        $ind->created_by = \Yii::$app->user->identity->id ?? null;
                        $ind->created_at = date('Y-m-d H:i:s');

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

                        $codTempIndicador[] = $ind->id;

                        //                    if (!$itemEstrutura['alternativas']) {
                        //                    Utils::debug($itemEstrutura);
                        //                    
                        //                    }

                        if (isset($itemEstrutura['alternativas'])) {

                            if ($itemEstrutura['alternativas'] != '') {

                                foreach ($itemEstrutura['alternativas'] as $key => $alternativa) {

                                    $selecionado = 0;

                                    if (is_object($alternativa)) {
                                        $alternativa = get_object_vars($alternativa);
                                    }

                                    if (isset($alternativa['nivel_referencia'])) {
                                        if ($alternativa['nivel_referencia'] == $ind->pontuacao) {
                                            $selecionado = 1;
                                        }
                                    }


                                    $alt = new ColetaAlternativa();
                                    if (isset($alternativa['nome'])) {
                                        $alt->nome = $alternativa['nome'];
                                    } else {
                                        $alt->nome = '';
                                    }
                                    $alt->indicador_id = $ind->id;
                                    $alt->peso = null;
                                    $alt->ordem = null;
                                    $alt->nivel_esforco = null;
                                    if (isset($alternativa['nivel_referencia'])) {
                                        $alt->nivel_referencia = $alternativa['nivel_referencia'];
                                    } else {
                                        $alt->nivel_referencia = '';
                                    }
                                    $alt->nivel_referencia_bn = null;
                                    $alt->selecionado = $selecionado;
                                    //$alt->cod_temp = $ind->id;
                                    $alt->status = 1;
                                    $alt->created_by = \Yii::$app->user->identity->id ?? null;
                                    $alt->created_at = date('Y-m-d H:i:s');

                                    if (!$alt->save()) {
                                        throw new HttpException(500, "Erro ao salvar a alternativa, motivo: " . json_encode($ind->getErrors()));
                                    }
                                    //}
                                }
                            }
                        }
                    } elseif (in_array($itemEstrutura['sotext'], ['Empreendimento', 'Logradouro', 'Número', 'Bairro', 'Município', 'CEP'])) {

                        $ind = new ColetaIndicador();
                        $ind->nome = $itemEstrutura['sotext'];
                        $ind->estrutura_id = null;
                        $ind->tipo = (string) ColetaIndicador::TIPO_STRING;
                        $ind->taxa_substituicao = 0;
                        $ind->pontuacao = $itemEstrutura['pontuacao'];
                        $ind->string_valor_escolhido = $itemEstrutura['string_valor_escolhido'];
                        $ind->cod_temp = $itemEstrutura['parent'];
                        $ind->status = 1;
                        $ind->created_by = \Yii::$app->user->identity->id ?? null;
                        $ind->created_at = date('Y-m-d H:i:s');

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

                        $codTempIndicador[] = $ind->id;
                    } else {

                        $taxa = null;

                        $est = new ColetaEstrutura();
                        $est->nome = $itemEstrutura['sotext'];
                        $est->cod_pai = $itemEstrutura['parent'];
                        $est->tipo_estrutura = $itemEstrutura['tipo'];
                        $est->coleta_id = $model->id;
                        $est->taxa_substituicao = $taxa;
                        $est->pontuacao = $itemEstrutura['pontuacao'];
                        $est->status = 1;
                        $est->created_by = \Yii::$app->user->identity->id ?? null;
                        $est->created_at = date('Y-m-d H:i:s');
                        $est->cod_temp = $itemEstrutura['id'];

                        if (!$est->save()) {
                            throw new HttpException(500, "E3- Erro ao salvar o item, motivo: " . $itemEstrutura['parent'] . ", " . json_encode($est->getErrors()));
                        }

                        if (!$primeiraEstrutura) {
                            $primeiraEstrutura = $est->id;
                        }
                    }
                }
            }


            ColetaEstrutura::updateAll(['taxa_substituicao' => -1], ['coleta_id' => $model->id, 'taxa_substituicao' => null]);

            Coleta::corrigiPai($model);

            Coleta::corrigiTaxaLista($model);

            $estruturaTemp = ArrayHelper::map(ColetaEstrutura::find()->where(['coleta_id' => $model->id])->all(), 'cod_temp', 'id');

            $indicadorTemp = ColetaIndicador::find()->andWhere(['in', 'id', $codTempIndicador])->all();

            foreach ($indicadorTemp as $iT) {

                if (isset($estruturaTemp[$iT->cod_temp])) {
                    $iT->estrutura_id = $estruturaTemp[$iT->cod_temp];
                    if (!$iT->save()) {
                        throw new HttpException(500, "Erro ao atualizar o pai do indicador, motivo: " . json_encode($iT->getErrors()));
                    }
                }
            }

            Contexto::geraPontuacao($model->contexto);
        }
    }

    public function actionImportar()
    {

        return false;

        \app\modules\performance\models\Base::loga("Acessou a importação da Coleta", $_GET, $_POST);

        $model = new Coleta();

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

        $model->status = Coleta::ATIVO;

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

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

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

            $duplica = explode('*', $model->duplica_id);

            $model->backoffice_cod = $duplica[1];

            $valid = Coleta::importa($model, $_POST);

            //atualizando pontuacao do Contexto
            if ($valid) {
                $valid = Contexto::geraPontuacao($model->contexto);
            }

            //preprocessando informações
            if ($valid) {
                //       $valid = Coleta::preprocessa($model);
            }

            //reorganizar indicadores 
            if ($valid) {
                $valid = Coleta::estruturaOrdenar($model);
            }

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

        if (Yii::$app->user->identity->id == 1) {
            $coletasImportadas = [];
        } else {
            $coletasImportadas = Coleta::find()->select('backoffice_cod')->where(['status' => Coleta::ATIVO])->andWhere(['is not', 'backoffice_cod', new \yii\db\Expression('null')])->column();
        }
        $coletasImportadas[] = 1;

        $psaColetasTodas = ArrayHelper::map(\app\modules\performance\models\Psacoleta::find()
            //->where(['id' => 9162])
            ->where(['ATV_PSACOLETA' => \app\modules\performance\models\Psacoleta::ATIVO])
            ->andwhere(['not in', 'COD_PSACOLETA', $coletasImportadas])
            ->orderBy('COD_PSACOLETA DESC')
            ->limit(2000)
            ->all(), 'dataCod', 'numeroNome');
        //        //->all(), 'id', 'nome');                                
        //        $psaColetas = [];
        //        $psaColetas['13/01/2020*9868'] = 'Felicita';
        $psaColetas = $psaColetasTodas;

        //        foreach ($psaColetasTodas as $key => $value) {
        //
        //            if (!in_array($key, $coletasImportadas)) {
        //                $psaColetas[$key] = $value;
        //            }
        //        }


        $contextos = ArrayHelper::map(Contexto::find()
            ->where(['active' => Contexto::ATIVO])
            ->andWhere('rgt-lft=1')
            ->all(), 'id', 'clienteNomeName');

        $projetos = ArrayHelper::map(Projeto::find()->where(['status' => Projeto::ATIVO])->orderBy('id DESC')->all(), 'id', 'clienteNome');

        return $this->render('importar', [
            'model' => $model,
            'psaColetas' => $psaColetas,
            'contextos' => $contextos,
            'projetos' => $projetos,
        ]);
    }

    public function actionEspecialTemplateGrafico($id, $grafico, $token)
    {

        if ($token != "lGRUQrMvnCTzF8ovZrSRaz5bk3wuA") {
            throw new HttpException(500, "Acesso negado");
        }

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

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

        if (!$coleta) {
            throw new HttpException(500, "Coleta não encontrada");
        }

        $niveisValorGlobal[] = ["from" => -100, "to" => 0, "color" => "#DF5353"];
        $niveisValorGlobal[] = ["from" => 1, "to" => 20, "color" => "#DF5353"];
        $niveisValorGlobal[] = ["from" => 21, "to" => 40, "color" => "#fe6a00"];
        $niveisValorGlobal[] = ["from" => 41, "to" => 60, "color" => "#e8dd11"];
        $niveisValorGlobal[] = ["from" => 61, "to" => 80, "color" => "#82e042"];
        $niveisValorGlobal[] = ["from" => 81, "to" => 100, "color" => "#089f50"];
        $niveisValorGlobal[] = ["from" => 101, "to" => 200, "color" => "#089f50"];

        $dadosEstrutura = [];
        $estrutura = [];
        $perfil = [];
        $risco = [];
        $dadosPVF = [];
        $dadosPVE1Orsegups = [];
        $dadosPVE2Orsegups = [];
        $dadosPVE3Orsegups = [];

        if ($grafico == 'estrutura') {
            $dadosEstrutura = json_decode($coleta->dados_estrutura, true);

            if (isset($dadosEstrutura['dados'])) {
                $estrutura = $dadosPerfilDesempenho['x'];
            } else {
                $estrutura = Coleta::estrutura($coleta);
            }
        }

        if ($grafico == 'perfil') {
            $perfil = json_decode(json_encode($coleta->dadosPerfilDesempenho), true);
        }

        if ($grafico == 'risco') {

            $cenario = RiscoCenario::find()->where(['status' => RiscoCenario::ATIVO, 'coleta_vinculo' => $coleta->id])->orderBy('id DESC')->one();

            if ($cenario) {
                $riscosCenario = Risco::find()->where(['risco_cenario_id' => $cenario->id, 'status' => Risco::ATIVO])->all();

                $riscosGrafico = [];
                $i = 1;
                foreach ($riscosCenario as $riscoCenario) {
                    $risco['categorias'][] = 'R' . $i;
                    $risco['nomes'][] = $riscoCenario->nome;
                    $i++;
                }

                $risco['consequencias'] = RiscoCenario::consequenciaValores($cenario);

                $risco['probabilidades'] = RiscoCenario::probabilidadeValores($cenario);
            }
        }

        if ($grafico == 'pvf') {
            $j = 1;
            $pvfs = $coleta->pvf;
            $dadosPVF = [];
            foreach ($pvfs as $pvf) {
                $dadosPVF[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pvf['nome'] . "</b>",
                    'y' => (int) $pvf['pontuacao'],
                    'color' => $pvf['cor'],
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve1-orsegups') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve1 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => 'Aspectos Estruturais e Tecnológicos',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve1) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 1");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve1->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE1Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE1Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve2-orsegups') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve2 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => 'Eventos críticos',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve2) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 2");
            }

            $indicadores = ColetaIndicador::find()
                ->where([
                    'estrutura_id' => $pve2->id,
                    'status' => ColetaIndicador::ATIVO,
                ])
                ->asArray()
                ->all();

            $dadosPVE2Orsegups = [];
            foreach ($indicadores as $indicador) {

                $p = round($indicador['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE2Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $indicador['nome'] . "</b>",
                    'y' => (int) $indicador['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve3-orsegups') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve3 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => 'Prestação de serviços',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve3) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 3");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve3->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE3Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE3Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve1-orsegups-material-construcao') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve3 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => '1. Limites perimetrais',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve3) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 3");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve3->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE3Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE3Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve2-orsegups-material-construcao') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve3 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => '2. Ambientes de acesso',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve3) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 3");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve3->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE3Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE3Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve3-orsegups-material-construcao') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve3 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => '3. Áreas de circulação externa da loja',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve3) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 3");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve3->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE3Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE3Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve4-orsegups-material-construcao') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve3 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => '4. Loja',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve3) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 3");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve3->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE3Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE3Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve5-orsegups-material-construcao') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve3 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => '5. Prestação de serviços',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve3) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 3");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve3->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE3Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE3Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }

        if ($grafico == 'pve6-orsegups-material-construcao') {
            $j = 1;

            $vertice = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'tipo_estrutura' => 'V',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$vertice) {
                throw new HttpException(500, "Erro 1 - Busca do Vértice");
            }

            $pve3 = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $vertice->id,
                    'nome' => '6. Sistema eletrônicos de segurança',
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->one();

            if (!$pve3) {
                throw new HttpException(500, "Erro 2 - Busca do PVE 3");
            }

            $pves = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coleta->id,
                    'cod_pai' => $pve3->id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->andWhere(['!=', 'taxa_substituicao', 0])
                ->asArray()
                ->all();

            $dadosPVE3Orsegups = [];
            foreach ($pves as $pve) {

                $p = round($pve['pontuacao']);

                $cor = '#DF5353';
                foreach ($niveisValorGlobal as $key => $value) {
                    if ($p >= (int) $value["from"] && $p <= (int) $value["to"]) {
                        $cor = $value["color"];
                    }
                }

                $dadosPVE3Orsegups[] = [
                    'cod_estrut' => $j,
                    'cod_estrut_pai' => 1,
                    'name' => "<b>" . $pve['nome'] . "</b>",
                    'y' => (int) $pve['pontuacao'],
                    'color' => $cor,
                    'tool' => 0,
                    'string' => 1,
                ];
                $j++;
            }
        }


        if (isset($_GET['debugvar'])) {
            Utils::debug(${$_GET['debugvar']});
        }
        //Utils::debug($dadosPVE1Orsegups);
        return $this->render('especial-template-grafico', [
            'coleta' => $coleta,
            'grafico' => $grafico,
            'estrutura' => $estrutura,
            'perfil' => $perfil,
            'risco' => $risco,
            'dadosPVF' => $dadosPVF,
            'dadosPVE1Orsegups' => $dadosPVE1Orsegups,
            'dadosPVE2Orsegups' => $dadosPVE2Orsegups,
            'dadosPVE3Orsegups' => $dadosPVE3Orsegups,
        ]);
    }

    public function actionRecuperaContexto($coleta)
    {

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

        if (!$model) {
            throw new HttpException(500, "Coleta não encontrada");
        }

        return $model->contexto_id;
    }

    public function actionItemAjax($id, $contexto = null, $aplicacao = null, $layout = null)
    {

        \app\models\Base::loga("Acessou a atualização de item da Coleta", $_GET, $_POST, 40);

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

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

        $coleta = null;
        $alternativas = null;
        $ordem = [];
        $o = 1;

        if ($tipo == 'E') {

            $item = $id;

            $model = ColetaEstrutura::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";
            }

            $coleta = Coleta::findOne(['id' => $model->coleta_id]);

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

            $meusContextos = GenericSearch::filterMyContextosAuditor()
                ->query
                ->select('id')
                ->andWhere('rgt-lft=1')
                ->andwhere(['=', 'active', Contexto::ATIVO])
                ->column();

            if (!in_array($coleta->contexto_id, $meusContextos)) {
                throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
            }

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


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

        if ($tipo == 'A') {

            $item = substr($id, 1);

            $model = ColetaAlternativa::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'>Alternativa " . $item . " não foi encontrado</div></div></div";
            }

            $coleta = Coleta::findOne(['id' => $model->indicador->estrutura->coleta_id]);

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


            $meusContextos = GenericSearch::filterMyContextosAuditor()
                ->query
                ->select('id')
                ->andWhere('rgt-lft=1')
                ->andwhere(['=', 'active', Contexto::ATIVO])
                ->column();

            if (!in_array($coleta->contexto_id, $meusContextos)) {
                throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
            }
        }

        if ($tipo == 'I') {

            $item = substr($id, 1);

            $model = ColetaIndicador::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";
            }

            $coleta = Coleta::findOne(['id' => $model->estrutura->coleta_id]);

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

            $meusContextos = GenericSearch::filterMyContextosAuditor()
                ->query
                ->select('id')
                ->andWhere('rgt-lft=1')
                ->andwhere(['=', 'active', Contexto::ATIVO])
                ->column();

            if (!in_array($coleta->contexto_id, $meusContextos)) {
                throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
            }

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

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


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

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

                $usaInterpolacao = false;

                if ($model->vertical_indicador_id) {
                    $verticalIndicador = \app\modules\performance\models\VerticalIndicador::findOne($model->vertical_indicador_id);

                    if ($verticalIndicador) {

                        if ($verticalIndicador->usa_interpolacao) {
                            $usaInterpolacao = true;
                        }
                    }
                }

                $coletaAlternativas = ColetaAlternativa::find()
                    ->where([
                        'indicador_id' => $item,
                        'status' => ColetaAlternativa::ATIVO,
                    ])
                    ->orderBy('nivel_referencia DESC')
                    ->all();

                $alternativas = '';

                if (!$usaInterpolacao) {
                    $checked = '';

                    foreach ($coletaAlternativas as $alternativa) {

                        if ($alternativa->selecionado == ColetaAlternativa::SELECIONADO) {
                            $checked = 'checked';
                        }

                        $alternativas .= '<div class="row-fluid"><div class="col-lg-12 col-md-12" style="height: 30px;"><input type="radio" id="alternativa" name="alternativa[]" value="' . $alternativa->id . '" ' . $checked . '>&nbsp<label>' . $alternativa->nome . '</label></div></div>';

                        $checked = '';
                    }
                }


                if ($usaInterpolacao) {

                    $checked = '';

                    foreach ($coletaAlternativas as $alternativa) {

                        if ($alternativa->selecionado == ColetaAlternativa::SELECIONADO) {
                            $checked = 'checked';
                        }

                        $alternativas .= '<div class="row-fluid"><div class="col-lg-12 col-md-12" style="height: 30px;"><input type="radio" id="alternativa" name="alternativa[]" value="' . $alternativa->id . '" ' . $checked . '>&nbsp<label>' . $alternativa->nome . '</label></div></div>';

                        $checked = '';
                    }

                    $texto = '';
                    $verticalAlternativa = \app\modules\performance\models\VerticalAlternativa::find()
                        ->where([
                            'indicador_id' => $verticalIndicador->id,
                            'status' => 1,
                        ])
                        ->one();
                    if ($verticalAlternativa) {
                        $texto = $verticalAlternativa->nome;
                    }

                    $alternativas .= '<div class="row">'
                        . '<div class="col-3 col-3">'
                        . '<label>Valor: </label> <br />'
                        . '<input type="number" step="0.01" name="IndicadorInterpolacaoValor[' . $model->id . ']" class="form-control">'
                        . '</div>'
                        . '<div class="col-9 col-md-9">'
                        . '<label>Texto: </label><br />'
                        . '<input type="text" name="IndicadorInterpolacaoTexto[' . $model->id . ']" value="' . $texto . '" class="form-control">'
                        . '</div>'
                        . '</div>';
                }
            }
        }

        if ($tipo == 'A') {

            $item = substr($id, 1);

            $model = ColetaAlternativa::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'>Alternativa " . $item . " não foi encontrado</div></div></div";
            }


            $meusContextos = GenericSearch::filterMyContextosAuditor()
                ->query
                ->select('id')
                ->andWhere('rgt-lft=1')
                ->andwhere(['=', 'active', Contexto::ATIVO])
                ->column();

            if (!in_array($model->indicador->estrutura->coleta->contexto_id, $meusContextos)) {
                throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
            }
        }

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

            $mudou = false;

            if ($tipo == 'E') {

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

                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!');
                }

                if ($coleta) {

                    $coleta->status = Coleta::statusLgpd($coleta);

                    $coleta->dados_perfil_desempenho = null;
                    $coleta->dados_estrutura = null;
                    $coleta->dados_pvfs = null;
                    $coleta->dados_descritor_estrutura_alternativa = null;
                    $coleta->dados_areas_preocupacao = null;
                    if (!$coleta->save()) {
                        throw new HttpException(500, "Erro ao atualizar a coleta " . $coleta->id . ", motivo: " . json_encode($coleta->getErrors()));
                    }
                }

                if ($coleta) {
                    Coleta::geraPontuacao($coleta);
                }

                if ($layout == 'contexto') {
                    $this->redirect(['/performance/coleta/view', 'id' => $model->coleta_id, 'contexto' => $contexto, 'aplicacao' => $aplicacao, 'layout' => $layout])->send();
                }

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

            if ($tipo == 'I') {

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

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

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


                    $usaInterpolacao = false;

                    if ($model->vertical_indicador_id) {
                        $verticalIndicador = \app\modules\performance\models\VerticalIndicador::findOne($model->vertical_indicador_id);

                        if ($verticalIndicador) {

                            if ($verticalIndicador->usa_interpolacao) {
                                $usaInterpolacao = true;
                            }
                        }
                    }

                    if ($usaInterpolacao) {

                        /*
                         * #10395
                         */
                        $verticalIndicador = VerticalIndicador::findOne($model->vertical_indicador_id);
                        if ($verticalIndicador) {
                            $verticalAlternativas = VerticalAlternativa::find()
                                ->select('interpolacao_absoluto')
                                ->where([
                                    'indicador_id' => $verticalIndicador->id,
                                    'status' => VerticalAlternativa::ATIVO
                                ])
                                ->column();

                            //                            foreach ($coletaAlternativas as $coletaAlternativa) {
                            //                                if (!in_array($coletaAlternativa->interpolacao_absoluto, $verticalAlternativas)) {
                            //                                    $coletaAlternativa->status = ColetaAlternativa::INATIVO;
                            //                                    $coletaAlternativa->save();
                            //                                }
                            //                            }
                        }

                        $mudouAlternativa = false;

                        if (is_numeric($_POST['IndicadorInterpolacaoValor'][$model->id])) {

                            $mudouAlternativa = true;

                            ColetaAlternativa::updateAll(['selecionado' => ColetaAlternativa::NAO_SELECIONADO], ['indicador_id' => $model->id]);

                            $ordemInterpolacao = null;

                            if (is_numeric($_POST['IndicadorInterpolacaoValor'][$model->id])) {
                                $nomeInterpolacao = $_POST['IndicadorInterpolacaoValor'][$model->id] . $_POST['IndicadorInterpolacaoTexto'][$model->id];
                            } else {
                                $nomeInterpolacao = '';
                            }

                            if (is_numeric($_POST['IndicadorInterpolacaoValor'][$model->id])) {
                                $nivelReferenciaInterpolacao = \app\modules\performance\models\Coleta::calculaInterpolacaoLinear($verticalIndicador, $_POST['IndicadorInterpolacaoValor'][$model->id], $verticalIndicador, $model->estrutura->coleta->contexto_id);
                            } else {
                                $nivelReferenciaInterpolacao = '';
                            }

                            $bnInterpolacao = null;
                            if ($nivelReferenciaInterpolacao == 100) {
                                $bnInterpolacao = 'B';
                            }
                            if ((float) $nivelReferenciaInterpolacao == 0) {
                                $bnInterpolacao = 'N';
                            }

                            if ($nivelReferenciaInterpolacao != "*") {

                                $excluir = \app\modules\performance\models\ColetaAlternativa::findOne([
                                    'indicador_id' => $model->id,
                                    'nivel_referencia' => $nivelReferenciaInterpolacao,
                                ]);
                                if ($excluir) {
                                    $excluir->delete();
                                }

                                $coletaAlternativa = new \app\modules\performance\models\ColetaAlternativa();
                                $coletaAlternativa->nome = $nomeInterpolacao;
                                $coletaAlternativa->indicador_id = $model->id;
                                $coletaAlternativa->peso = 1;
                                $coletaAlternativa->ordem = $ordemInterpolacao;
                                $coletaAlternativa->nivel_esforco = 1;
                                $coletaAlternativa->nivel_referencia = $nivelReferenciaInterpolacao;
                                $coletaAlternativa->nivel_referencia_bn = null;
                                $coletaAlternativa->status = \app\modules\performance\models\ColetaAlternativa::ATIVO;
                                $coletaAlternativa->created_by = Yii::$app->user->identity->id ?? null;
                                $coletaAlternativa->created_at = date('Y-m-d H:i:s');
                                $coletaAlternativa->cod_temp = $model->id;
                                $coletaAlternativa->selecionado = 1;
                                $coletaAlternativa->interpolacao_absoluto = $_POST['IndicadorInterpolacaoValor'][$model->id];

                                if (!$coletaAlternativa->save()) {
                                    $valid = false;
                                    throw new HttpException(500, "E5 - Erro ao salvar a alternativa INTERPOLAÇÃO dos indicadores da Coleta, motivo: " . json_encode($coletaAlternativa->getErrors()));
                                }
                            }
                        } else {

                            $mudouAlternativa = false;
                            foreach ($coletaAlternativas as $coletaAlternativa) {

                                if ($coletaAlternativa->id == $_POST['alternativa'][0]) {
                                    $coletaAlternativa->selecionado = ColetaAlternativa::SELECIONADO;
                                } else {
                                    $coletaAlternativa->selecionado = ColetaAlternativa::NAO_SELECIONADO;
                                }

                                if ($coletaAlternativa->oldAttributes['selecionado'] != $coletaAlternativa->selecionado) {
                                    $mudouAlternativa = true;
                                }

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

                    if (!$usaInterpolacao) {

                        $mudouAlternativa = false;
                        foreach ($coletaAlternativas as $coletaAlternativa) {

                            if ($coletaAlternativa->id == $_POST['alternativa'][0]) {
                                $coletaAlternativa->selecionado = ColetaAlternativa::SELECIONADO;
                            } else {
                                $coletaAlternativa->selecionado = ColetaAlternativa::NAO_SELECIONADO;
                            }

                            if ($coletaAlternativa->oldAttributes['selecionado'] != $coletaAlternativa->selecionado) {
                                $mudouAlternativa = true;
                            }

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

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

                    if ($mudou) {
                        Yii::$app->session->setFlash('success', 'Indicador atualizado com sucesso!');
                    }
                    if ($mudouAlternativa) {
                        Yii::$app->session->setFlash('warning', Html::a('A Coleta foi alterada, clique aqui para gerar a nova pontuação!', ['gera-pontuacao', 'id' => $model->estrutura->coleta_id]));
                    }

                    if ($coleta) {

                        $coleta->status = Coleta::statusLgpd($coleta);

                        $coleta->dados_perfil_desempenho = null;
                        $coleta->dados_estrutura = null;
                        $coleta->dados_pvfs = null;
                        $coleta->dados_descritor_estrutura_alternativa = null;
                        $coleta->dados_areas_preocupacao = null;
                        if (!$coleta->save()) {
                            throw new HttpException(500, "Erro ao atualizar a coleta " . $coleta->id . ", motivo: " . json_encode($coleta->getErrors()));
                        }
                    }

                    if ($coleta) {
                        Coleta::geraPontuacao($coleta);
                    }

                    if ($coleta->projeto_id == 72) {
                        Coleta::base100GovSc($coleta);
                    }


                    if ($layout == 'contexto') {
                        $this->redirect(['/performance/coleta/view', 'id' => $model->estrutura->coleta_id, 'contexto' => $contexto, 'aplicacao' => $aplicacao, 'layout' => $layout])->send();
                    }

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

            if ($tipo == 'A') {

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

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

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

                if ($coleta) {

                    $coleta->status = Coleta::statusLgpd($coleta);

                    $coleta->dados_perfil_desempenho = null;
                    $coleta->dados_estrutura = null;
                    $coleta->dados_pvfs = null;
                    $coleta->dados_descritor_estrutura_alternativa = null;
                    $coleta->dados_areas_preocupacao = null;
                    if (!$coleta->save()) {
                        throw new HttpException(500, "Erro ao atualizar a coleta " . $coleta->id . ", motivo: " . json_encode($coleta->getErrors()));
                    }
                }

                if ($coleta) {
                    Coleta::geraPontuacao($coleta);
                }


                if ($layout == 'contexto') {
                    $this->redirect(['/performance/coleta/view', 'id' => $model->indicador->estrutura->coleta_id, 'contexto' => $contexto, 'aplicacao' => $aplicacao, 'layout' => $layout])->send();
                }

                return $this->redirect(['/performance/coleta/view', 'id' => $model->indicador->estrutura->coleta_id]);
            }
        }

        Yii::$app->assetManager->bundles = ['yii\web\JqueryAsset' => false];

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

    public function actionGeraPontuacao($id, $contexto = null, $aplicacao = null, $layout = null)
    {

        \app\models\Base::loga("Acessou a geração da pontuação da Coleta", $_GET, $_POST, 41);

        $model = Coleta::findOne($id);

        if (!$model) {
            throw new HttpException(500, "Coleta não encontrada!");
        }

        $meusContextos = GenericSearch::filterMyContextosAuditor()
            ->query
            ->select('id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->column();

        if (!in_array($model->contexto_id, $meusContextos)) {
            throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
        }

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $valid = Coleta::geraPontuacao($model);

        if ($valid) {
            Contexto::geraPontuacaoEstrutura($model->contexto);
        }

        if ($valid) {
            Contexto::geraPontuacao($model->contexto);
        }

        if ($valid) {
            Yii::$app->session->setFlash('success', 'Pontuação gerada com sucesso');
            return $this->redirect(['/performance/coleta/view', 'id' => $id, 'contexto' => $contexto, 'aplicacao' => $aplicacao, 'layout' => $layout]);
        }
    }

    public function actionCopia($id, $contexto = null, $aplicacao = null, $layout = null)
    {

        \app\models\Base::loga("Acessou a geração de cópia da Coleta", $_GET, $_POST, 42);

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

        if (!$model) {
            throw new HttpException(500, "Coleta não encontrada!");
        }

        /*
         * Verificando se é Prospecção e se já possui Coleta
         */
        if ($model->contexto->tipoLicenca != 'Licenciado') {
            $coletaExiste = Coleta::find()
                ->where([
                    'contexto_id' => $model->contexto_id,
                ])
                ->andWhere(['!=', 'status', Coleta::INATIVO])
                ->one();
            if ($coletaExiste) {
                Yii::$app->session->setFlash('error', "Esse Cliente está em Prospecção e já possui uma Análise");
                $this->redirect([
                    '/performance/coleta/contexto',
                    'contexto' => $model->contexto_id,
                    'aplicacao' => $aplicacao,
                ])
                    ->send();
                exit();
            }
        }

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $meusContextos = GenericSearch::filterMyContextosAuditor()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $clientesMeusContextos = [];

        $projetosMeusContextos = [];

        foreach ($meusContextos as $meuContexto) {

            $clientesMeusContextos[] = $meuContexto->cliente_id;

            $projetosMeusContextos = array_merge($projetosMeusContextos, Projeto::find()
                ->select('id')
                ->where(['status' => Projeto::ATIVO])
                ->andWhere([
                    'or',
                    ['like', 'contextos', $meuContexto->id . ','],
                    ['=', 'contextos', $meuContexto->id],
                ])
                ->column());
        }

        $projetosMeusContextos = array_merge($projetosMeusContextos, Projeto::find()
            ->select('id')
            ->where([
                'status' => Projeto::ATIVO,
                'contextos' => '*,',
            ])
            ->andWhere(['in', 'cliente_id', $clientesMeusContextos])
            ->column());

        $projetos = ArrayHelper::map(Projeto::find()
            ->where(['status' => Projeto::ATIVO])
            ->andWhere(['in', 'id', $projetosMeusContextos])
            ->orderBy('id DESC')
            ->all(), 'id', 'clienteNome');

        

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

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

                $valid = true;

                $copia = new Coleta();
                $copia->nome = $model->nome;
                $copia->projeto_id = $model->projeto_id;
                $copia->contexto_id = $model->contexto_id;
                $copia->vertical_id = $model->vertical_id;
                $copia->data_coleta = date('Y-m-d H:i:s');
                $copia->status = Coleta::ATIVO;
                $copia->created_by = \Yii::$app->user->identity->id ?? null;
                $copia->created_at = date('Y-m-d H:i:s');

                if (!$copia->save()) {
                    $valid = false;
                    throw new HttpException(500, "Erro ao salvar a cópia, motivo: " . json_encode($copia->getErrors()));
                }

                if ($valid) {
                    $valid = Coleta::geraCopia($model, $copia);
                }

                if ($valid) {
                    $valid = Coleta::geraPontuacao($copia);
                }

                $transaction->commit();

                return $this->redirect(['preencher', 'id' => $copia->id, 'contexto' => $contexto, 'aplicacao' => $aplicacao, 'layout' => $layout]);
            } catch (Exception $e) {

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

        if ($layout == 'contexto') {

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

            $contexto = Contexto::findOne($contexto);

            if (!$contexto) {
                return '<div class="alert alert-danger">Erro! Cliente não encontrado!</div>';
            }

            $aplicacao = \app\modules\performance\models\Aplicacao::findOne($aplicacao);

            if (!$aplicacao) {
                return '<div class="alert alert-danger">Erro! Aplicação não encontrada!</div>';
            }

            $tarefasAtrasadas = \app\modules\performance\models\Tarefa::find()
                ->join('LEFT JOIN', 'pa_acao_proposta', 'pa_acao_proposta.id=pa_tarefa.pa_acao_proposta_id')
                ->join('LEFT JOIN', 'pa_plano_acao', 'pa_plano_acao.id=pa_acao_proposta.pa_plano_acao_id')
                ->where([
                    'pa_plano_acao.contexto_id' => $contexto->id,
                    'pa_acao_proposta.status' => \app\modules\performance\models\PlanoAcao::ATIVO,
                    'pa_plano_acao.status' => \app\modules\performance\models\AcaoProposta::ATIVO,
                ])
                ->andWhere(['<', 'pa_tarefa.termino_previsto', date('Y-m-d')])
                ->andWhere(['!=', 'pa_tarefa.situacao', \app\modules\performance\models\Tarefa::SITUACAO_ENCERRADA])
                ->orderBy('pa_plano_acao_id ASC, pa_tarefa.termino_previsto ASC, pa_tarefa.id ASC')
                ->all();

            $totalNotificacoes = count($tarefasAtrasadas);

            $permiteEditar = true;

            $ultimasAtualizacoes = \app\models\Log::find()
                ->where([
                    'contexto_id' => $contexto->id,
                ])
                ->andWhere(['!=', 'mensagem', 'Acessou a visualização de Contexto'])
                ->orderBy('id DESC')
                ->limit(10)
                ->all();

            return $this->render('copia_contexto', [
                'contexto' => $contexto,
                'aplicacao' => $aplicacao,
                'totalNotificacoes' => $totalNotificacoes,
                'permiteEditar' => $permiteEditar,
                'ultimasAtualizacoes' => $ultimasAtualizacoes,
                'model' => $model,
                'projetos' => $projetos,
            ]);
        }

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

    public function actionContextoVerticalCsv($contexto, $vertical)
    {

        // Utils::debug($coleta->descritorEstruturaAlternativa);
        $verticalIndicadores = VerticalIndicador::find()
            ->joinWith('estrutura')
            ->where([
                'vertical_estrutura.vertical_id' => $vertical,
                'vertical_indicador.status' => VerticalIndicador::ATIVO,
            ])
            ->orderBy('vertical_indicador.ordem ASC')
            ->all();


        $coletas = Coleta::find()
            ->where([
                'contexto_id' => $contexto,
                'vertical_id' => $vertical,
                'status' => Coleta::ATIVO,
            ])
            ->orderBy('data_coleta DESC')
            ->all();
        //Utils::debug($coletas);
        $coletasLabel = '';
        $perfis = [];

        foreach ($coletas as $coleta) {

            $dadosPerfil = $coleta->dadosPerfilDesempenho;

            if (isset($dadosPerfil['valores'])) {
                $perfis[$coleta->id] = $dadosPerfil['valores'];
            }


            $coletasLabel .= '"' . $coleta->nome . '",';
        }
        $coletasLabel = substr($coletasLabel, 0, -1);

        $dados = '';
        $dados .= 'Indicador, ' . $coletasLabel . PHP_EOL;

        $k = 0;

        foreach ($verticalIndicadores as $indicador) {
            $dadosColeta = '';

            foreach ($perfis as $key => $perfil) {
                if (isset($perfil[$k])) {
                    $dadosColeta .= $perfil[$k] . ',';
                }
            }

            $dadosColeta = substr($dadosColeta, 0, -1);


            $dados .= $indicador->nome . ', ' . $dadosColeta . PHP_EOL;

            $k++;
        }

        //Utils::debug($dadosPerfil);
        return $dados;
    }

    public function actionOrdenarIndicadores($id)
    {

        \app\models\Base::loga("Acessou a ordenação dos indicadores da Coleta", $_GET, $_POST, 43);

        $model = Coleta::findOne($id);

        if (!$model) {
            throw new HttpException(500, "Erro: coleta não encontrada");
        }
        Coleta::estruturaOrdenar($model);

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

    public function actionReorganizaEstrutura($id, $contexto = null, $aplicacao = null, $layout = null)
    {

        \app\models\Base::loga("Acessou a reorganização da estrutura da Coleta", $_GET, $_POST, 44);

        $model = Coleta::findOne($id);

        if (!$model) {
            throw new HttpException(500, "Erro: coleta não encontrada");
        }

        $meusContextos = GenericSearch::filterMyContextosAuditor()
            ->query
            ->select('id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->column();

        if (!in_array($model->contexto_id, $meusContextos)) {
            throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
        }

        Coleta::estruturaOrdenar($model);

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

    public function actionAnaliseDados($id)
    {

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

        $model = Coleta::findOne($id);

        $meusContextos = GenericSearch::filterMyContextosAuditor()
            ->query
            ->select('id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->column();

        if (!in_array($model->contexto_id, $meusContextos)) {
            throw new HttpException(403, "Erro: contexto não pertence a seus clientes");
        }

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $verticalEstrutura = VerticalEstrutura::find()
            ->select('id')
            ->where([
                'status' => VerticalEstrutura::ATIVO,
                'vertical_id' => $model->vertical_id,
            ])
            ->orderBy('ordem ASC')
            ->column();

        $verticalIndicadores = VerticalIndicador::find()
            ->join('INNER JOIN', 'vertical_estrutura', 'vertical_estrutura.id=vertical_indicador.estrutura_id')
            ->where(['vertical_indicador.status' => VerticalIndicador::ATIVO])
            ->andWhere(['in', 'vertical_indicador.estrutura_id', $verticalEstrutura])
            ->orderBy('vertical_estrutura.ordem ASC, vertical_indicador.ordem ASC')
            ->all();

        $respostasAlternativas = ColetaAlternativa::find()
            ->select(['coleta_indicador.vertical_indicador_id as id', 'coleta_alternativa.nome', 'coleta_alternativa.nivel_referencia'])
            ->join('INNER JOIN', 'coleta_indicador', 'coleta_indicador.id=coleta_alternativa.indicador_id')
            ->join('INNER JOIN', 'coleta_estrutura', 'coleta_estrutura.id=coleta_indicador.estrutura_id')
            ->where([
                'coleta_alternativa.selecionado' => ColetaAlternativa::SELECIONADO,
                'coleta_alternativa.status' => ColetaAlternativa::ATIVO,
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                'coleta_estrutura.coleta_id' => $id,
            ])
            ->all();
        $respostasAbsoluto = [];
        $respostasCardinal = [];

        foreach ($respostasAlternativas as $respostasAlternativa) {
            $respostasAbsoluto[$respostasAlternativa['id']] = round((float) str_replace(",", ".", (string) $respostasAlternativa['nome']), 2);
            $respostasCardinal[$respostasAlternativa['id']] = round((float) str_replace(",", ".", (string) $respostasAlternativa['nivel_referencia']), 2);
        }

        //Utils::debug($respostasCardinal);
        $tabela = '';
        $tabela .= '<div class="row" style="font-style: italic;font-size: 12px;">'
            . '<div class="col-3">Nome</div>'
            . '<div class="col-4">Conceito</div>'
            . '<div class="col-1">Mín. Absoluto</div>'
            . '<div class="col-1">Máx. Absoluto</div>'
            . '<div class="col-1">Valor Absoluto</div>'
            . '<div class="col-1">Cardinal</div>'
            . '<div class="col-1">Análise</div>'
            . '</div>';


        foreach ($verticalIndicadores as $verticalIndicador) {

            $valor = 'N/D';
            $cardinal = 'N/D';

            if (isset($respostasAbsoluto[$verticalIndicador->id])) {
                $valor = $respostasAbsoluto[$verticalIndicador->id];
            }
            if (isset($respostasCardinal[$verticalIndicador->id])) {
                $cardinal = $respostasCardinal[$verticalIndicador->id];
            }


            $a1 = VerticalAlternativa::find()
                ->where([
                    'indicador_id' => $verticalIndicador->id,
                    'status' => 1
                ])
                ->orderBy('abs(interpolacao_absoluto) ASC')
                ->one();

            $a5 = VerticalAlternativa::find()
                ->where([
                    'indicador_id' => $verticalIndicador->id,
                    'status' => 1
                ])
                ->orderBy('abs(interpolacao_absoluto) DESC')
                ->one();

            $analise = '-';
            $minimo = '-';
            $maximo = '-';

            if ($verticalIndicador->usa_interpolacao) {

                $analise = '-';
                $minimo = '-';
                $maximo = '-';

                if ($a5 && $a1) {


                    if (floatval($a5->interpolacao_absoluto) > floatval($a1->interpolacao_absoluto)) {
                        $minimo = floatval($a1->interpolacao_absoluto);
                        $maximo = floatval($a5->interpolacao_absoluto);
                    } else {
                        $minimo = floatval($a5->interpolacao_absoluto);
                        $maximo = floatval($a1->interpolacao_absoluto);
                    }
                }

                if ($valor == 'N/D') {
                    $analise = 'N/D';
                } elseif (floatval($valor) < $minimo) {
                    $analise = 'Abaixo do mínimo';
                } elseif (floatval($valor) > $maximo) {
                    $analise = 'Acima do máximo';
                } else {
                    $analise = 'OK';
                }
            }

            $tabela .= '<div class="row" style="font-size: 12px;">'
                . '<div class="col-3">' . $verticalIndicador->nome . '</div>'
                . '<div class="col-4">' . $verticalIndicador->conceito . '</div>'
                . '<div class="col-1">' . $minimo . '</div>'
                . '<div class="col-1">' . $maximo . '</div>'
                . '<div class="col-1">' . $valor . '</div>'
                . '<div class="col-1">' . $cardinal . '</div>'
                . '<div class="col-1">' . $analise . '</div>'
                . '</div><hr>';
        }

        $tabela .= '</table>';
        return $this->render('analise-dados', ['model' => $model, 'tabela' => $tabela]);
    }

    public function actionCalendarInfo($aplicacao_id, $id, $from, $to)
    {

        $this->responseAsJson();

        $retorno = [];

        $verticaisId = AplicacaoTemProjeto::find()
            ->joinWith('projeto')
            ->join('INNER JOIN', 'projeto_tem_vertical', 'projeto_tem_vertical.projeto_id=projeto.id')
            ->select('projeto_tem_vertical.vertical_id')
            ->where([
                'aplicacao_tem_projeto.aplicacao_id' => $aplicacao_id,
                'projeto.status' => Projeto::ATIVO,
            ])
            ->column();

        $coletas = Coleta::find()
            ->where([
                'contexto_id' => $id,
                'vertical_id' => $verticaisId,
                'status' => Coleta::ATIVO,
            ])
            ->andWhere(['between', 'data_coleta', $from, $to])
            ->all();

        foreach ($coletas as $coleta) {

            $retorno[] = [
                "borderColor" => "#ec9f9f90",
                "category" => "time",
                "isReadOnly" => true,
                "isAllDay" => true,
                "bgColor" => $coleta->valorGlobalCor,
                "color" => "white",
                "customStyle" => "text-align:center;",
                "dragBgColor" => $coleta->valorGlobalCor,
                "id" => $coleta->id,
                "calendarId" => 2,
                "start" => $coleta->data_coleta,
                "end" => $coleta->data_coleta,
                "title" => $coleta->valorGlobal . ' pts',
                "body" => "",
                "raw" => [
                    "source" => "",
                ]
            ];
        }

        return ['time' => json_encode($retorno)];
    }

    public function actionGeraColetaLemonde($data_coleta, $rotulo_coleta, $r19, $r20, $r21)
    {

        return false;

        $vertical = 257;
        $formA1 = 19;
        $formA2 = 20;
        $formA3 = 21;
        $projeto = 134;
        $contexto = 22273;
        $createdBy = \Yii::$app->user->identity->id ?? null;

        $respostaArea1 = \app\modules\performance\models\FormularioResposta::findOne($r19);

        $respostaArea2 = \app\modules\performance\models\FormularioResposta::findOne($r20);

        $respostaArea3 = \app\modules\performance\models\FormularioResposta::findOne($r21);

        $deParaVerticalIndicadorPergunta = [];
        $deParaVerticalIndicadorPergunta[21453] = 112;
        $deParaVerticalIndicadorPergunta[21454] = 113;
        $deParaVerticalIndicadorPergunta[21455] = 114;
        $deParaVerticalIndicadorPergunta[21456] = 115;
        $deParaVerticalIndicadorPergunta[21457] = 116;
        $deParaVerticalIndicadorPergunta[21458] = 117;
        $deParaVerticalIndicadorPergunta[21459] = 118;
        $deParaVerticalIndicadorPergunta[21460] = 119;
        $deParaVerticalIndicadorPergunta[21461] = 121;
        $deParaVerticalIndicadorPergunta[21462] = 122;
        $deParaVerticalIndicadorPergunta[21463] = 123;
        $deParaVerticalIndicadorPergunta[21464] = 124;
        $deParaVerticalIndicadorPergunta[21798] = 126;
        $deParaVerticalIndicadorPergunta[21799] = 127;
        $deParaVerticalIndicadorPergunta[21800] = 128;
        $deParaVerticalIndicadorPergunta[21801] = 129;
        $deParaVerticalIndicadorPergunta[21802] = 130;
        $deParaVerticalIndicadorPergunta[21803] = 131;
        $deParaVerticalIndicadorPergunta[21804] = 132;
        $deParaVerticalIndicadorPergunta[21805] = 133;
        $deParaVerticalIndicadorPergunta[21806] = 134;
        $deParaVerticalIndicadorPergunta[21807] = 135;
        $deParaVerticalIndicadorPergunta[21808] = 136;
        $deParaVerticalIndicadorPergunta[21809] = 138;
        $deParaVerticalIndicadorPergunta[21810] = 139;
        $deParaVerticalIndicadorPergunta[21811] = 140;
        $deParaVerticalIndicadorPergunta[21812] = 141;
        $deParaVerticalIndicadorPergunta[21813] = 142;
        $deParaVerticalIndicadorPergunta[21814] = 143;
        $deParaVerticalIndicadorPergunta[21818] = 147;
        $deParaVerticalIndicadorPergunta[21819] = 148;
        $deParaVerticalIndicadorPergunta[21820] = 149;
        $deParaVerticalIndicadorPergunta[21821] = 144;
        $deParaVerticalIndicadorPergunta[21822] = 145;
        $deParaVerticalIndicadorPergunta[21823] = 146;
        $deParaVerticalIndicadorPergunta[21824] = 150;
        $deParaVerticalIndicadorPergunta[21825] = 151;
        $deParaVerticalIndicadorPergunta[21826] = 152;
        $deParaVerticalIndicadorPergunta[21882] = 120;
        $deParaVerticalIndicadorPergunta[22189] = 174;

        if ($respostaArea1 && $respostaArea2 && $respostaArea3) {

            $respostas = [];
            foreach ($respostaArea1->formularioPerguntaRespostas as $area1) {
                $respostas[$area1->formularioPergunta->id] = $area1->resposta;
            }
            foreach ($respostaArea2->formularioPerguntaRespostas as $area2) {
                $respostas[$area2->formularioPergunta->id] = $area2->resposta;
            }
            foreach ($respostaArea3->formularioPerguntaRespostas as $area3) {
                $respostas[$area3->formularioPergunta->id] = $area3->resposta;
            }

            $valid = true;

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

            $transaction = $connection->beginTransaction();
            try {
                $coleta = new Coleta();
                $coleta->nome = $rotulo_coleta;
                $coleta->projeto_id = $projeto;
                $coleta->vertical_id = $vertical;
                $coleta->contexto_id = $contexto;
                $coleta->data_coleta = $data_coleta;
                $coleta->status = Coleta::ATIVO;
                $coleta->created_by = $createdBy;
                $coleta->created_at = $data_coleta . ' 00:00:00';

                if (!$coleta->save()) {
                    throw new \Exception(json_encode($coleta->getErrors()), 1);
                    $valid = false;
                }

                if ($valid) {

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

                    foreach ($origem->verticalEstruturas as $estruturaBase) {
                        if ($valid) {
                            if ($estruturaBase->status == VerticalEstrutura::ATIVO) {

                                $coletaEstrutura = new ColetaEstrutura();
                                $coletaEstrutura->nome = $estruturaBase->nome;
                                $coletaEstrutura->cod_pai = $estruturaBase->cod_pai;
                                $coletaEstrutura->ordem = $estruturaBase->ordem;
                                $coletaEstrutura->tipo_estrutura = $estruturaBase->tipo_estrutura;
                                $coletaEstrutura->nome_reduzido = $estruturaBase->nome_reduzido;
                                $coletaEstrutura->coleta_id = $coleta->id;
                                $coletaEstrutura->taxa_substituicao = $estruturaBase->taxa_substituicao;
                                $coletaEstrutura->status = VerticalEstrutura::ATIVO;
                                $coletaEstrutura->created_by = Yii::$app->user->identity->id ?? null;
                                $coletaEstrutura->created_at = $data_coleta . ' 00:00:00';
                                $coletaEstrutura->cod_temp = $estruturaBase->id;

                                if (!$coletaEstrutura->save()) {
                                    $valid = false;
                                    throw new HttpException(500, "E3 - Erro ao salvar a estrutura da Coleta, motivo: " . json_encode($coletaEstrutura->getErrors()));
                                }

                                //salvando indicadores                    
                                if ($valid) {
                                    $indicadoresBase = VerticalIndicador::find()
                                        ->where([
                                            'estrutura_id' => $estruturaBase->id,
                                            'status' => VerticalIndicador::ATIVO,
                                        ])
                                        ->all();

                                    foreach ($indicadoresBase as $indicadorBase) {
                                        if ($valid) {
                                            if ($indicadorBase->status == VerticalIndicador::ATIVO) {

                                                $coletaIndicador = new ColetaIndicador();
                                                $coletaIndicador->nome = $indicadorBase->nome;
                                                $coletaIndicador->tipo = $indicadorBase->tipo;
                                                $coletaIndicador->estrutura_id = $coletaEstrutura->id;
                                                $coletaIndicador->taxa_substituicao = $indicadorBase->taxa_substituicao;
                                                $coletaIndicador->obrigatorio = $indicadorBase->obrigatorio;
                                                $coletaIndicador->status = VerticalIndicador::ATIVO;
                                                $coletaIndicador->created_by = Yii::$app->user->identity->id ?? null;
                                                $coletaIndicador->created_at = $data_coleta . ' 00:00:00';
                                                $coletaIndicador->cod_temp = $indicadorBase->id;
                                                //$coletaIndicador->ordem_estruturada = $indicadorBase->ordem_estruturada;
                                                $coletaIndicador->conceito = $indicadorBase->conceito;
                                                $coletaIndicador->vertical_indicador_id = $indicadorBase->id;

                                                if (!$coletaIndicador->save()) {
                                                    $valid = false;
                                                    throw new HttpException(500, "E4 - Erro ao salvar os indicadores da Coleta, motivo: " . json_encode($coletaIndicador->getErrors()));
                                                }

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

                                                    foreach ($alternativasBase as $alternativaBase) {
                                                        if ($valid) {
                                                            if ($alternativaBase->status == VerticalAlternativa::ATIVO) {

                                                                $verticalIndicador = \app\modules\performance\models\VerticalIndicador::find()
                                                                    ->where([
                                                                        'id' => $alternativaBase->indicador->id,
                                                                        'status' => \app\modules\performance\models\VerticalIndicador::ATIVO,
                                                                    ])
                                                                    ->one();
                                                                if (!$verticalIndicador) {
                                                                    $valid = false;
                                                                    throw new HttpException(500, "VI1 - Erro ao salvar a alternativa dos indicadores da Coleta, motivo: indicador da vertical não encontrao");
                                                                }

                                                                $opcaoEscolhida = null;
                                                                $selecionado = null;

                                                                if ($verticalIndicador->usa_interpolacao == \app\modules\performance\models\VerticalIndicador::NAO) {

                                                                    if (isset($deParaVerticalIndicadorPergunta[$verticalIndicador->id])) {

                                                                        $perguntaId = $deParaVerticalIndicadorPergunta[$verticalIndicador->id];
                                                                        if (isset($respostas[$perguntaId])) {
                                                                            $opcaoEscolhida = $respostas[$perguntaId];

                                                                            if (md5($opcaoEscolhida) == md5($alternativaBase->nome)) {
                                                                                $selecionado = ColetaAlternativa::SELECIONADO;
                                                                            } else {
                                                                                $selecionado = ColetaAlternativa::NAO_SELECIONADO;
                                                                            }
                                                                        }
                                                                    }
                                                                }

                                                                $coletaAlternativa = new ColetaAlternativa();
                                                                $coletaAlternativa->nome = $alternativaBase->interpolacao_absoluto . $alternativaBase->nome;
                                                                $coletaAlternativa->indicador_id = $coletaIndicador->id;
                                                                $coletaAlternativa->peso = $alternativaBase->peso;
                                                                $coletaAlternativa->ordem = $alternativaBase->ordem;
                                                                $coletaAlternativa->nivel_esforco = $alternativaBase->nivel_esforco;
                                                                $coletaAlternativa->nivel_referencia = $alternativaBase->nivel_referencia;
                                                                $coletaAlternativa->nivel_referencia_bn = $alternativaBase->nivel_referencia_bn;
                                                                $coletaAlternativa->selecionado = $selecionado;
                                                                $coletaAlternativa->status = VerticalAlternativa::ATIVO;
                                                                $coletaAlternativa->created_by = Yii::$app->user->identity->id ?? null;
                                                                $coletaAlternativa->created_at = $data_coleta . ' 00:00:00';
                                                                $coletaAlternativa->cod_temp = $alternativaBase->id;
                                                                $coletaAlternativa->interpolacao_absoluto = $alternativaBase->interpolacao_absoluto;

                                                                if (!$coletaAlternativa->save()) {
                                                                    $valid = false;
                                                                    throw new HttpException(500, "E5 - Erro ao salvar a alternativa dos indicadores da Coleta, motivo: " . json_encode($coletaAlternativa->getErrors()));
                                                                }
                                                            }
                                                        }
                                                    }

                                                    if ($verticalIndicador->usa_interpolacao == \app\modules\performance\models\VerticalIndicador::SIM) {

                                                        $ordemInterpolacao = $coletaAlternativa->ordem++;

                                                        $opcaoEscolhida = null;
                                                        $selecionado = null;

                                                        if (isset($deParaVerticalIndicadorPergunta[$verticalIndicador->id])) {

                                                            $perguntaId = $deParaVerticalIndicadorPergunta[$verticalIndicador->id];
                                                            if (isset($respostas[$perguntaId])) {
                                                                $respostaDigitada = $respostas[$perguntaId];
                                                            }
                                                        }
                                                        //Utils::debug([$verticalIndicador->id, $perguntaId, $respostaDigitada, $respostas, $deParaVerticalIndicadorPergunta]);

                                                        $nomeInterpolacao = $respostaDigitada . $alternativasBase[0]->nome;

                                                        $nivelReferenciaInterpolacao = Coleta::calculaInterpolacaoLinear($verticalIndicador, $respostaDigitada, $coletaIndicador, $coleta->contexto_id);

                                                        $bnInterpolacao = null;
                                                        if ($nivelReferenciaInterpolacao == 100) {
                                                            $bnInterpolacao = 'B';
                                                        }
                                                        if ((float) $nivelReferenciaInterpolacao == 0) {
                                                            $bnInterpolacao = 'N';
                                                        }

                                                        $excluir = ColetaAlternativa::findOne([
                                                            'indicador_id' => $coletaIndicador->id,
                                                            'nivel_referencia' => $nivelReferenciaInterpolacao,
                                                        ]);
                                                        if ($excluir) {
                                                            $excluir->delete();
                                                        }

                                                        $coletaAlternativa = new ColetaAlternativa();
                                                        $coletaAlternativa->nome = $nomeInterpolacao;
                                                        $coletaAlternativa->indicador_id = $coletaIndicador->id;
                                                        $coletaAlternativa->peso = $alternativaBase->peso;
                                                        $coletaAlternativa->ordem = $alternativaBase->ordem;
                                                        $coletaAlternativa->nivel_esforco = $alternativaBase->nivel_esforco;
                                                        $coletaAlternativa->nivel_referencia = $nivelReferenciaInterpolacao;
                                                        $coletaAlternativa->nivel_referencia_bn = $bnInterpolacao;
                                                        $coletaAlternativa->selecionado = ColetaAlternativa::SELECIONADO;
                                                        $coletaAlternativa->status = ColetaAlternativa::ATIVO;
                                                        $coletaAlternativa->created_by = Yii::$app->user->identity->id ?? null;
                                                        $coletaAlternativa->created_at = $data_coleta . ' 00:00:00';
                                                        $coletaAlternativa->cod_temp = $alternativaBase->id;
                                                        $coletaAlternativa->interpolacao_absoluto = $alternativaBase->interpolacao_absoluto;

                                                        if (!$coletaAlternativa->save()) {
                                                            $valid = false;
                                                            throw new HttpException(500, "E5 - Erro ao salvar a alternativa dos indicadores da Coleta, motivo: " . json_encode($coletaAlternativa->getErrors()));
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    Coleta::corrigiPai($coleta);
                    Coleta::geraPontuacao($coleta);
                    Coleta::estruturaOrdenar($coleta);
                }

                $transaction->commit();

                return $this->redirect(['view', 'id' => $coleta->id]);
            } catch (Exception $e) {
                $transaction->rollback();
                throw new HttpException(500, $e->getMessage());
            }
        }

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

    public function actionContexto($contexto, $aplicacao)
    {

        \app\models\Base::loga("Acessou a lista de Coletas do Contexto", $_GET, $_POST, 35);

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

        $contexto = \app\modules\performance\models\Contexto::findOne($contexto);

        if (!$contexto) {
            throw new HttpException(500, "Erro! Cliente não encontrado");
        }

        $aplicacao = \app\modules\performance\models\Aplicacao::findOne($aplicacao);

        if (!$aplicacao) {
            throw new HttpException(500, "Erro! Cliente não encontrado");
        }


        $isCeon = \app\components\Logged::isCeon();

        if (!$isCeon) {
            $meusContextos = GenericSearch::filterMyContextosVisualizacao()
                ->query
                ->select('contexto.id')
                ->andWhere('rgt-lft=1')
                ->andwhere(['=', 'contexto.id', $contexto->id])
                ->column();

            if (!$meusContextos) {
                throw new HttpException(500, "Erro! Cliente não permitido para seu usuário");
            }
        }


        $permissaoContextoGestor = \app\models\UserHasResource::find()
            ->where([
                //    'resource_id' => $contexto->id,
                'user_id' => Yii::$app->user->identity->id,
                'role' => \app\models\UserHasResource::NV_CP_CONTEXTO_ADM,
            ])
            ->one();

        $permissaoClienteGestor = \app\models\UserHasResource::find()
            ->where([
                //    'resource_id' => $contexto->id,
                'user_id' => Yii::$app->user->identity->id,
                'role' => \app\models\UserHasResource::NV_CP_CLIENTE_ADM,
            ])
            ->one();

        if ($permissaoContextoGestor || $permissaoClienteGestor || $isCeon) {
            $avisaPendencia = true;
            $botoes = true;
            $permiteEditar = true;
        } else {
            $avisaPendencia = false;
            $botoes = false;
            $permiteEditar = false;
        }

        $tarefasAtrasadas = \app\modules\performance\models\Tarefa::find()
            ->join('LEFT JOIN', 'pa_acao_proposta', 'pa_acao_proposta.id=pa_tarefa.pa_acao_proposta_id')
            ->join('LEFT JOIN', 'pa_plano_acao', 'pa_plano_acao.id=pa_acao_proposta.pa_plano_acao_id')
            ->join('LEFT JOIN', 'contexto', 'contexto.id=pa_plano_acao.contexto_id')
            ->join('LEFT JOIN', 'user_has_resource', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'contexto.id' => $contexto->id,
                'pa_acao_proposta.status' => \app\modules\performance\models\PlanoAcao::ATIVO,
                'pa_plano_acao.status' => \app\modules\performance\models\AcaoProposta::ATIVO,
                'contexto.active' => \app\modules\performance\models\Contexto::ATIVO,
            ])
            ->andWhere(['<', 'pa_tarefa.termino_previsto', date('Y-m-d')])
            ->andWhere(['!=', 'pa_tarefa.situacao', \app\modules\performance\models\Tarefa::SITUACAO_ENCERRADA])
            ->orderBy('pa_plano_acao_id ASC, pa_tarefa.termino_previsto ASC, pa_tarefa.id ASC')
            ->all();

        $totalNotificacoes = count($tarefasAtrasadas);

        $ultimasAtualizacoes = \app\models\Log::find()
            ->where([
                'contexto_id' => $contexto->id,
            ])
            ->andWhere(['!=', 'mensagem', 'Acessou a visualização de Contexto'])
            ->orderBy('id DESC')
            ->limit(10)
            ->all();

        $logo = \app\models\BaseModel::logo();

        $searchModel = new ColetaSearch();

        $searchModel->contexto_id = $contexto->id;

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

        return $this->render('contexto', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'contexto' => $contexto,
            'aplicacao' => $aplicacao,
            'isCeon' => $isCeon,
            'permiteEditar' => $permiteEditar,
            'totalNotificacoes' => $totalNotificacoes,
            'ultimasAtualizacoes' => $ultimasAtualizacoes,
            'logo' => $logo,
        ]);
    }

    public function actionLgpdCreate($contexto, $aplicacao)
    {

        \app\models\Base::loga("Acessou a criação de Coleta da LGPD", $_GET, $_POST, 37, $contexto);

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

        $model = new Coleta();

        $meusContextos = GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();


        if (!$isCeon) {
            $contextosPermitidos = [];
            foreach ($meusContextos as $meuContexto) {
                $contextosPermitidos[] = $meuContexto->id;
            }
            if (!in_array($contexto, $contextosPermitidos)) {
                throw new HttpException(403, "Cliente não permitido para seu usuário");
            }
        }

        /*
         * Verificando se é Prospecção e se já possui Coleta
         */

        $contextoProspeccao = Contexto::findOne($contexto);
        if (!$contextoProspeccao) {
            throw new HttpException(500, "Cliente não encontrado");
        }
        if ($contextoProspeccao->tipoLicenca != 'Licenciado') {
            $coletaExiste = Coleta::find()
                ->where([
                    'contexto_id' => $contextoProspeccao->id,
                ])
                ->andWhere(['!=', 'status', Coleta::INATIVO])
                ->one();
            if ($coletaExiste) {
                Yii::$app->session->setFlash('error', "Esse Cliente está aguardando liberação e já possui uma Análise");
                $this->redirect([
                    '/performance/coleta/contexto',
                    'contexto' => $contextoProspeccao->id,
                    'aplicacao' => $aplicacao,
                ])
                    ->send();
                exit();
            }
        }

        $model->contexto_id = $contexto;
        $model->vertical_id = Vertical::PADRAO_LGPD;

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $projetoBase = AplicacaoTemProjeto::find()
            ->where([
                'aplicacao_id' => $aplicacao
            ])
            ->one();
        if ($projetoBase) {
            $model->projeto_id = $projetoBase->projeto_id;
        } else {
            throw new HttpException(500, "Projeto base não encontrado, entre em contato com suporte");
        }

        $model->nome = date('d/m/Y');

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

        $model->status = Coleta::NAO_HOMOLOGADA;

        $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 gerar a análise, motivo: " . json_encode($model->getErrors()));
        }

        $valid = true;

        if ($valid) {
            $valid = Coleta::criaEstruturaIndicadorAlternativa($model, $model->vertical, []);
        }

        if ($valid) {
            $valid = Coleta::corrigiPai($model);
        }

        if ($valid) {
            $valid = Coleta::estruturaOrdenar($model);
        }

        $this->redirect([
            'lgpd-update',
            'id' => $model->id,
            'contexto' => $contexto,
            'aplicacao' => $aplicacao
        ])
            ->send();
    }

    public function actionLgpdUpdate($id, $contexto, $aplicacao)
    {

        \app\models\Base::loga("Acessou a atualização de Coleta da LGPD", $_GET, $_POST, 37, $contexto);

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

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

        $meusContextos = GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();


        if (!$isCeon) {
            $contextosPermitidos = [];
            foreach ($meusContextos as $meuContexto) {
                $contextosPermitidos[] = $meuContexto->id;
            }
            if (!in_array($contexto, $contextosPermitidos)) {
                throw new HttpException(403, "Cliente não permitido para seu usuário");
            }
        }

        $model->contexto_id = $contexto;
        $model->vertical_id = Vertical::PADRAO_LGPD;

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $projetoBase = AplicacaoTemProjeto::find()
            ->where([
                'aplicacao_id' => $aplicacao
            ])
            ->one();
        if ($projetoBase) {
            $model->projeto_id = $projetoBase->projeto_id;
        } else {
            throw new HttpException(500, "Projeto base não encontrado, entre em contato com suporte");
        }

        $model->nome = $model->nome ?? date('d/m/Y');

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

        $model->status = $model->status ?? Coleta::NAO_HOMOLOGADA;

        $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 gerar a análise, motivo: " . json_encode($model->getErrors()));
        }

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

            $valid = true;

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

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

                $model->status = Coleta::statusLgpd($model);

                //salvando a coleta
                if ($valid) {
                    if (!$model->save()) {
                        $valid = false;
                        throw new HttpException(500, "E1 - Erro ao salvar a coleta, motivo: " . json_encode($model->getErrors()));
                    }
                }

                //gerar pontuacao
                if ($valid) {
                    $valid = Coleta::geraPontuacao($model);
                }

                //gerar pontuacao do contexto
                if ($valid) {
                    $valid = Contexto::geraPontuacao($model->contexto);
                }


                $transaction->commit();

                if ($contexto && $aplicacao) {
                    $url = ['/performance/contexto/view', 'id' => $contexto, 'aplicacao_id' => $aplicacao];
                    return $this->redirect($url)->send();
                } else {
                    return $this->redirect(['view', 'id' => $model->id]);
                }
            } catch (Exception $e) {
                $transaction->rollback();
                throw new HttpException(500, $e->getMessage());
            }
        }

        $avisaPendencia = true;
        $botoes = true;
        $permiteEditar = true;

        $tarefasAtrasadas = \app\modules\performance\models\Tarefa::find()
            ->join('LEFT JOIN', 'pa_acao_proposta', 'pa_acao_proposta.id=pa_tarefa.pa_acao_proposta_id')
            ->join('LEFT JOIN', 'pa_plano_acao', 'pa_plano_acao.id=pa_acao_proposta.pa_plano_acao_id')
            ->join('LEFT JOIN', 'contexto', 'contexto.id=pa_plano_acao.contexto_id')
            ->join('LEFT JOIN', 'user_has_resource', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'contexto.id' => $contexto,
                'pa_acao_proposta.status' => \app\modules\performance\models\PlanoAcao::ATIVO,
                'pa_plano_acao.status' => \app\modules\performance\models\AcaoProposta::ATIVO,
                'contexto.active' => \app\modules\performance\models\Contexto::ATIVO,
            ])
            ->andWhere(['<', 'pa_tarefa.termino_previsto', date('Y-m-d')])
            ->andWhere(['!=', 'pa_tarefa.situacao', \app\modules\performance\models\Tarefa::SITUACAO_ENCERRADA])
            ->orderBy('pa_plano_acao_id ASC, pa_tarefa.termino_previsto ASC, pa_tarefa.id ASC')
            ->all();

        $totalNotificacoes = count($tarefasAtrasadas);

        $ultimasAtualizacoes = \app\models\Log::find()
            ->where([
                'contexto_id' => $contexto,
            ])
            ->andWhere(['!=', 'mensagem', 'Acessou a visualização de Contexto'])
            ->orderBy('id DESC')
            ->limit(10)
            ->all();

        $logo = \app\models\BaseModel::logo();

        $alternativasSelecionadas = ArrayHelper::map(ColetaIndicador::find()
            ->select('coleta_indicador.id as id, coleta_alternativa.id as nome')
            ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id = coleta_indicador.estrutura_id')
            ->join('LEFT JOIN', 'coleta_alternativa', 'coleta_indicador.id = coleta_alternativa.indicador_id')
            ->where([
                'coleta_estrutura.coleta_id' => $model->id,
                'coleta_alternativa.selecionado' => ColetaAlternativa::SELECIONADO,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_alternativa.status' => ColetaAlternativa::ATIVO,
            ])->all(), 'id', 'nome');

        // $pvfs = $model->lgpdPvfs;

        $estrutura = Coleta::estruturaFormLgpd($model, $alternativasSelecionadas);

        $totalIndicadores = 0;
        foreach ($estrutura as $key => $est) {
            $totalIndicadores += count($est['indicadores']);
        }

        //Utils::debug($alternativasSelecionadas);
        return $this->render('_form_lgpd', [
            'model' => $model,
            'contextoModel' => $model->contexto,
            'aplicacao' => $aplicacao,
            'isCeon' => $isCeon,
            'permiteEditar' => $permiteEditar,
            'totalNotificacoes' => $totalNotificacoes,
            'ultimasAtualizacoes' => $ultimasAtualizacoes,
            'logo' => $logo,
            'estrutura' => $estrutura,
            'estrutura1' => $estrutura,
            'totalIndicadores' => $totalIndicadores,
            'alternativasSelecionadas' => $alternativasSelecionadas,
        ]);
    }

    public function actionLgpdUpdateIndicador($contexto, $coleta, $indicador, $alternativa)
    {

        \app\models\Base::loga("Acessou a atualização de indicador de Coleta da LGPD", $_GET, $_POST, 37, $contexto);

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

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

        $meusContextos = GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();

        if (!$isCeon) {
            $contextosPermitidos = [];
            foreach ($meusContextos as $meuContexto) {
                $contextosPermitidos[] = $meuContexto->id;
            }
            if (!in_array($model->contexto_id, $contextosPermitidos)) {
                throw new HttpException(403, "Cliente não permitido para seu usuário");
            }
        }

        if (!$model->contexto->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $valid = true;

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

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

            ColetaAlternativa::updateAll(['selecionado' => ColetaAlternativa::NAO_SELECIONADO], ['indicador_id' => $indicador]);

            $coletaAlternativa = ColetaAlternativa::find()
                ->where([
                    'id' => $alternativa
                ])
                ->one();

            if (!$coletaAlternativa) {
                $valid = false;
                $msg = "Erro ao salvar o item, motivo: " . Json::encode($novoScope->getErrors());
            }

            $coletaAlternativa->selecionado = ColetaAlternativa::SELECIONADO;

            if ($valid) {
                if (!$coletaAlternativa->save()) {
                    $valid = false;
                    $msg = "Erro ao salvar o item, motivo: " . Json::encode($novoScope->getErrors());
                }
            }

            if ($valid) {
                $transaction->commit();
                return Json::encode(array('status' => 'success', 'type' => 'success', 'message' => "Resposta salva com sucesso"));
            } else {
                $transaction->rollback();
                return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => $msg));
            }
        } catch (Exception $e) {
            $transaction->rollback();
            throw new HttpException(500, $e->getMessage());
        }
    }

    public function actionNewUpdateIndicadorInterpolacao($contexto, $coleta, $indicador, $valor, $texto, $minimo, $maximo)
    {

        \app\models\Base::loga("Acessou a atualização de indicador de com interpolação de Coleta New", $_GET, $_POST, 37);

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

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

        $meusContextos = GenericSearch::filterMyContextosGestor()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();

        if (!$isCeon) {
            $contextosPermitidos = [];
            foreach ($meusContextos as $meuContexto) {
                $contextosPermitidos[] = $meuContexto->id;
            }
            if (!in_array($model->contexto_id, $contextosPermitidos)) {
                throw new HttpException(403, "Cliente não permitido para seu usuário");
            }
        }

        $valid = true;

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

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

            if ($valor > $maximo) {
                $valid = false;
                $msg = "Valor não pode ser maior do que " . $maximo;
            }

            if ($valor < $minimo) {
                $valid = false;
                $msg = "Valor não pode ser menor do que " . $minimo;
            }

            if ($valid) {
                ColetaAlternativa::updateAll(['selecionado' => ColetaAlternativa::NAO_SELECIONADO], ['indicador_id' => $indicador]);

                ColetaAlternativa::updateAll(['status' => ColetaAlternativa::ATIVO], ['and', ['indicador_id' => $indicador], ['<', 'ordem', 100]]);

                ColetaAlternativa::updateAll(['status' => ColetaAlternativa::INATIVO], ['and', ['indicador_id' => $indicador], ['ordem' => 100]]);

                ColetaAlternativa::updateAll(['status' => ColetaAlternativa::INATIVO], ['and', ['indicador_id' => $indicador], ['interpolacao_absoluto' => $valor]]);
            }

            if ($valid) {
                $coletaIndicador = ColetaIndicador::findOne($indicador);

                if (!$coletaIndicador) {
                    $valid = false;
                    $msg = "Indicador não encontrado";
                }
            }

            if ($valid) {
                $cardinal = Coleta::calculaInterpolacaoLinear($coletaIndicador->verticalIndicador, $valor, $coletaIndicador);

                $bn = '';
                if ($cardinal === 100) {
                    $bn = 'B';
                }
                if ($cardinal === 0) {
                    $bn = 'N';
                }

                $coletaAlternativa = new ColetaAlternativa();
                $coletaAlternativa->status = ColetaAlternativa::ATIVO;
                $coletaAlternativa->indicador_id = $indicador;
                $coletaAlternativa->nome = $valor . $texto;
                $coletaAlternativa->ordem = 100;
                $coletaAlternativa->nivel_esforco = 1;
                $coletaAlternativa->nivel_referencia = $cardinal;
                $coletaAlternativa->nivel_referencia_bn = $bn;
                $coletaAlternativa->selecionado = ColetaAlternativa::SELECIONADO;
                $coletaAlternativa->created_by = Yii::$app->user->identity->id ?? null;
                $coletaAlternativa->created_at = date('Y-m-d H:i:s');
                $coletaAlternativa->interpolacao_absoluto = $valor;

                if (!$coletaAlternativa->save()) {
                    $valid = false;
                    $msg = Json::encode($coletaAlternativa->getErrors());
                }
            }

            if ($valid) {
                $transaction->commit();
                return Json::encode(array('status' => 'success', 'type' => 'success', 'message' => "Resposta salva com sucesso"));
            } else {
                $transaction->rollback();
                return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => $msg));
            }
        } catch (Exception $e) {
            $transaction->rollback();
            throw new HttpException(500, $e->getMessage());
        }
    }

    public function actionAtualizarNovaVersao($id, $contexto, $aplicacao)
    {

        $contextoModel = \app\modules\performance\models\Contexto::find()
            ->where([
                'id' => $contexto,
                'active' => \app\modules\performance\models\Contexto::ATIVO,
            ])
            ->one();

        if (!$contextoModel) {
            throw new \yii\web\HttpException(500, "Cliente não encontrado");
        }

        if (!$contextoModel->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $meusContextos = \app\models\GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->select('contexto.id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'contexto.id', $contextoModel->id])
            ->column();

        if (!$meusContextos) {
            throw new \yii\web\HttpException(500, 'Erro! Cliente não permitido para seu usuário');
        }

        $coleta = \app\modules\performance\models\Coleta::findOne($id);

        //se nao tem coleta ativa gera
        if (!$coleta) {
            throw new \yii\web\HttpException(500, "Coleta não encontrada");
        }

        $nome = date('d/m/Y');
        $verticalId = Vertical::PADRAO_LGPD;
        $projetoId = $coleta->projeto_id;
        $contextoId = $coleta->contexto_id;

        $copia = \app\modules\performance\models\Coleta::geraColetaGenericaSemIndicador($nome, $verticalId, $projetoId, $contextoId, \Yii::$app->user->identity->id);

        \app\modules\performance\models\Coleta::geraIndicadoresPopulaComInventarioDados($copia);

        // Utils::debug($copia);

        $copia->atualiza = Coleta::ATUALIZA_NAO;

        if (!$copia->save()) {
            throw new HttpException(500, "Erro ao desmarcar a atualização da coleta, motivo: " . json_encode($copia->getErrors()));
        }

        //dispara calculo pontuacao coleta, contexto
        \app\modules\performance\models\Coleta::estruturaOrdenar($copia);
        \app\modules\performance\models\Coleta::geraPontuacao($copia);
        \app\modules\performance\models\Contexto::geraPontuacao($copia->contexto);


        return $this->redirect(['/performance/contexto/view', 'id' => $contexto, 'aplicacao_id' => $aplicacao]);
    }

    public function actionAtualizar($id, $contexto, $aplicacao)
    {

        $contextoModel = \app\modules\performance\models\Contexto::find()
            ->where([
                'id' => $contexto,
                'active' => \app\modules\performance\models\Contexto::ATIVO,
            ])
            ->one();

        if (!$contextoModel) {
            throw new \yii\web\HttpException(500, "Cliente não encontrado");
        }

        if (!$contextoModel->acessoTemporarioLiberado) {
            throw new \yii\web\HttpException(500, "Cliente não autorizado para seu usuário, solicite acesso temporário ao gestor do Escritório");
        }

        $meusContextos = \app\models\GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->select('contexto.id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'contexto.id', $contextoModel->id])
            ->column();

        if (!$meusContextos) {
            throw new \yii\web\HttpException(500, 'Erro! Cliente não permitido para seu usuário');
        }

        $coleta = \app\modules\performance\models\Coleta::findOne($id);

        if (!$coleta) {
            throw new \yii\web\HttpException(500, "Coleta não encontrada");
        }

        $projeto = Projeto::find()
            ->where([
                'cliente_id' => $contextoModel->cliente_id,
                'status' => Projeto::ATIVO
            ])
            ->andWhere([
                'OR',
                ['like', 'contextos', $contextoModel->id],
                ['like', 'contextos', $contextoModel->id . ','],
            ])
            ->one();

        if (!$projeto) {
            throw new HttpException(500, "Projeto não encontrado");
        }

        $projetoTemVertical = ProjetoTemVertical::find()
            ->where([
                'projeto_id' => $projeto->id,
            ])
            ->one();

        $nome = date('d/m/Y');
        $verticalId = $projetoTemVertical->vertical_id;
        $projetoId = $projeto->id;
        $contextoId = $contexto;

        $coleta = \app\modules\performance\models\Coleta::geraColetaGenerica($nome, $verticalId, $projetoId, $contextoId, \Yii::$app->user->identity->id);

        if ($coleta->projeto->codigo_pos_coleta) {
            eval("\$pos = {$coleta->projeto->codigo_pos_coleta}");
        }

        return $this->redirect(['/performance/coleta/preencher', 'id' => $coleta->id, 'contexto' =>$contexto, 'aplicacao' => $aplicacao]);
        //return $this->redirect(['/performance/contexto/view', 'id' => $contexto, 'aplicacao_id' => $aplicacao]);
    }

    public function actionNovaInformacao($indicador)
    {

        $id = substr($indicador, 1);

        $coletaIndicador = ColetaIndicador::findOne($id);

        if (!$coletaIndicador) {
            throw new HttpException(500, "Indicador não encontrado");
        }

        $coletaAlternativas = ColetaAlternativa::find()
            ->where([
                'status' => ColetaAlternativa::ATIVO,
                'indicador_id' => $coletaIndicador->id,
            ])
            ->orderBy('nivel_referencia DESC')
            ->all();

        $verticalAlternativas = VerticalAlternativa::find()
            ->where([
                'status' => VerticalAlternativa::ATIVO,
                'indicador_id' => $coletaIndicador->vertical_indicador_id,
            ])
            ->orderBy('nivel_referencia DESC')
            ->all();

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

            $valid = true;

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

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

                $coletaIndicador->nome = $coletaIndicador->verticalIndicador->nome;
                $coletaIndicador->conceito = $coletaIndicador->verticalIndicador->conceito;
                if (!$coletaIndicador->save()) {
                    $valid = false;
                    throw new HttpException(500, json_encode($coletaIndicador->getErrors()));
                }

                $selecionado = $_POST['temp'] ?? 'Z';

                foreach ($coletaAlternativas as $coletaAlternativa) {
                    if ($valid) {
                        $coletaAlternativa->status = ColetaAlternativa::INATIVO;
                        if (!$coletaAlternativa->save()) {
                            $valid = false;
                            throw new HttpException(500, json_encode($coletaAlternativa->getErrors()));
                        }
                    }
                }

                $ordem = 0;
                foreach ($verticalAlternativas as $alternativaBase) {
                    if ($valid) {
                        if ($alternativaBase->status == VerticalAlternativa::ATIVO) {
                            $coletaAlternativa = new ColetaAlternativa();
                            $coletaAlternativa->nome = $alternativaBase->interpolacao_absoluto . $alternativaBase->nome;
                            $coletaAlternativa->indicador_id = $coletaIndicador->id;
                            $coletaAlternativa->peso = $alternativaBase->peso;
                            $coletaAlternativa->ordem = $alternativaBase->ordem;
                            $coletaAlternativa->nivel_esforco = $alternativaBase->nivel_esforco;
                            $coletaAlternativa->nivel_referencia = $alternativaBase->nivel_referencia;
                            $coletaAlternativa->nivel_referencia_bn = $alternativaBase->nivel_referencia_bn;
                            $coletaAlternativa->status = ColetaAlternativa::ATIVO;
                            $coletaAlternativa->created_by = \Yii::$app->user->isGuest ? 1 : \Yii::$app->user->identity->id;
                            $coletaAlternativa->created_at = date('Y-m-d H:i:s');
                            $coletaAlternativa->cod_temp = $alternativaBase->id;
                            $coletaAlternativa->interpolacao_absoluto = $alternativaBase->interpolacao_absoluto;

                            if ($selecionado == $coletaAlternativa->nivel_referencia) {
                                $coletaAlternativa->selecionado = 1;
                            }

                            if (!$coletaAlternativa->save()) {
                                $valid = false;
                                throw new HttpException(500, "E5 - Erro ao salvar a alternativa dos indicadores da Coleta, motivo: " . json_encode($coletaAlternativa->getErrors()));
                            }

                            $ordem = $alternativaBase->ordem;
                        }
                    }
                }

                if ($valid && $selecionado == 100000) {
                    $ordemInterpolacao = $ordem++;

                    if (isset($_POST['interpolacao_absoluto'])) {
                        $nomeInterpolacao = $_POST['interpolacao_absoluto'] . $_POST['nome'];
                    } else {
                        $nomeInterpolacao = '';
                    }
                    if (isset($_POST['interpolacao_absoluto'])) {
                        $nivelReferenciaInterpolacao = Coleta::calculaInterpolacaoLinear($coletaIndicador->verticalIndicador, $_POST['interpolacao_absoluto'], $coletaIndicador, $coletaIndicador->estrutura->coleta->contexto_id);
                    } else {
                        $nivelReferenciaInterpolacao = '';
                    }

                    //Utils::debug($nivelReferenciaInterpolacao);

                    $bnInterpolacao = null;
                    if ($nivelReferenciaInterpolacao == 100) {
                        $bnInterpolacao = 'B';
                    }
                    if ((float) $nivelReferenciaInterpolacao == 0) {
                        $bnInterpolacao = 'N';
                    }

                    if (is_numeric($nivelReferenciaInterpolacao)) {

                        if (is_numeric($_POST['interpolacao_absoluto'])) {

                            ColetaAlternativa::deleteAll([
                                'indicador_id' => $coletaIndicador->id,
                                'interpolacao_absoluto' => $_POST['interpolacao_absoluto'],
                            ]);

                            $coletaAlternativa = new ColetaAlternativa();
                            $coletaAlternativa->nome = $nomeInterpolacao;
                            $coletaAlternativa->indicador_id = $coletaIndicador->id;
                            $coletaAlternativa->peso = 1;
                            $coletaAlternativa->ordem = $ordemInterpolacao;
                            $coletaAlternativa->nivel_esforco = 1;
                            $coletaAlternativa->nivel_referencia = $nivelReferenciaInterpolacao;
                            $coletaAlternativa->nivel_referencia_bn = null;
                            $coletaAlternativa->status = ColetaAlternativa::ATIVO;
                            $coletaAlternativa->created_by = Yii::$app->user->identity->id ?? null;
                            $coletaAlternativa->created_at = date('Y-m-d H:i:s');
                            $coletaAlternativa->cod_temp = null;
                            $coletaAlternativa->selecionado = 1;
                            $coletaAlternativa->interpolacao_absoluto = $_POST['interpolacao_absoluto'];

                            if (!$coletaAlternativa->save()) {
                                $valid = false;
                                throw new HttpException(500, "E5 - Erro ao salvar a alternativa INTERPOLAÇÃO dos indicadores da Coleta, motivo: " . json_encode($coletaAlternativa->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {
                    Coleta::geraPontuacao($coletaIndicador->estrutura->coleta);
                }


                $transaction->commit();

                return $this->redirect(['view', 'id' => $coletaIndicador->estrutura->coleta_id]);
            } catch (Exception $e) {
                $transaction->rollback();
                throw new HttpException(500, $e->getMessage());
            }
        }

        return $this->render('nova-informacao', [
            'coletaIndicador' => $coletaIndicador,
            'coletaAlternativas' => $coletaAlternativas,
            'verticalAlternativas' => $verticalAlternativas,
        ]);
    }

    public function actionPreencher($id, $contexto, $aplicacao)
    {

        \app\models\Base::loga("Acessou o preenchimento da Coleta Interrompida", $_GET, $_POST, 37);

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

        $meusContextos = GenericSearch::filterMyContextosGestor()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();


        if (!$isCeon) {
            $contextosPermitidos = [];
            foreach ($meusContextos as $meuContexto) {
                $contextosPermitidos[] = $meuContexto->id;
            }
            if (!in_array($model->contexto_id, $contextosPermitidos)) {
                throw new HttpException(403, "Cliente não permitido para seu usuário");
            }
        }

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

            $valid = true;

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

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

                // $model->status = Coleta::ATIVO;

                //salvando a coleta
                if ($valid) {
                    if (!$model->save()) {
                        $valid = false;
                        throw new HttpException(500, "E1 - Erro ao salvar a coleta, motivo: " . json_encode($model->getErrors()));
                    }
                }

                //gerar pontuacao
                if ($valid) {
                    $valid = Coleta::geraPontuacao($model);
                }

                if ($valid) {
                    Contexto::geraPontuacao($model->contexto);
                }


                $transaction->commit();

                return $this->redirect(['/performance/contexto/view', 'id' => $model->contexto_id]);
            } catch (Exception $e) {
                $transaction->rollback();
                throw new HttpException(500, $e->getMessage());
            }
        }

        $alternativasSelecionadas = ArrayHelper::map(ColetaIndicador::find()
            ->select('coleta_indicador.id as id, coleta_alternativa.id as nome')
            ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id = coleta_indicador.estrutura_id')
            ->join('LEFT JOIN', 'coleta_alternativa', 'coleta_indicador.id = coleta_alternativa.indicador_id')
            ->where([
                'coleta_estrutura.coleta_id' => $model->id,
                'coleta_alternativa.selecionado' => ColetaAlternativa::SELECIONADO,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_alternativa.status' => ColetaAlternativa::ATIVO,
            ])->all(), 'id', 'nome');


        $estrutura = Coleta::estruturaFormNew($model, $alternativasSelecionadas);

        //Utils::debug($estrutura);

        $totalIndicadores = 0;
        foreach ($estrutura as $key => $est) {
            $totalIndicadores += count($est['indicadores']);
        }

        return $this->render('preencher', [
            'model' => $model,
            'estrutura' => $estrutura,
            'totalIndicadores' => $totalIndicadores,
            'alternativasSelecionadas' => $alternativasSelecionadas,
        ]);
    }

    public function actionNewUpdateIndicador($contexto, $coleta, $indicador, $alternativa)
    {

        \app\models\Base::loga("Acessou a atualização de indicador de Coleta New", $_GET, $_POST, 37);

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

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

        $meusContextos = GenericSearch::filterMyContextosGestor()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();

        if (!$isCeon) {
            $contextosPermitidos = [];
            foreach ($meusContextos as $meuContexto) {
                $contextosPermitidos[] = $meuContexto->id;
            }
            if (!in_array($model->contexto_id, $contextosPermitidos)) {
                throw new HttpException(403, "Cliente não permitido para seu usuário");
            }
        }

        $valid = true;

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

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

            ColetaAlternativa::updateAll(['selecionado' => ColetaAlternativa::NAO_SELECIONADO], ['indicador_id' => $indicador]);

            ColetaAlternativa::updateAll(['status' => ColetaAlternativa::INATIVO], ['and', ['indicador_id' => $indicador], ['ordem' => 100]]);

            $coletaAlternativa = ColetaAlternativa::find()
                ->where([
                    'id' => $alternativa
                ])
                ->one();

            if (!$coletaAlternativa) {
                $valid = false;
                $msg = "Erro ao salvar o item, motivo: " . Json::encode($coletaAlternativa->getErrors());
            }

            $coletaAlternativa->selecionado = ColetaAlternativa::SELECIONADO;

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

            if ($valid) {
                $transaction->commit();
                return Json::encode(array('status' => 'success', 'type' => 'success', 'message' => "Resposta salva com sucesso"));
            } else {
                $transaction->rollback();
                return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => $msg));
            }
        } catch (Exception $e) {
            $transaction->rollback();
            throw new HttpException(500, $e->getMessage());
        }
    }

    public function actionNewUpdateIndicadorInterpolacao1($contexto, $coleta, $indicador, $valor, $texto, $minimo, $maximo)
    {

        \app\models\Base::loga("Acessou a atualização de indicador de com interpolação de Coleta New", $_GET, $_POST, 37);

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

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

        $meusContextos = GenericSearch::filterMyContextosGestor()
            ->query
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->all();

        $isCeon = \app\components\Logged::isCeon();

        if (!$isCeon) {
            $contextosPermitidos = [];
            foreach ($meusContextos as $meuContexto) {
                $contextosPermitidos[] = $meuContexto->id;
            }
            if (!in_array($model->contexto_id, $contextosPermitidos)) {
                throw new HttpException(403, "Cliente não permitido para seu usuário");
            }
        }

        $valid = true;

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

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

            if ($valor > $maximo) {
                $valid = false;
                $msg = "Valor não pode ser maior do que " . $maximo;
            }

            if ($valor < $minimo) {
                $valid = false;
                $msg = "Valor não pode ser menor do que " . $minimo;
            }

            if ($valid) {
                ColetaAlternativa::updateAll(['selecionado' => ColetaAlternativa::NAO_SELECIONADO], ['indicador_id' => $indicador]);

                ColetaAlternativa::updateAll(['status' => ColetaAlternativa::ATIVO], ['and', ['indicador_id' => $indicador], ['<', 'ordem', 100]]);

                ColetaAlternativa::updateAll(['status' => ColetaAlternativa::INATIVO], ['and', ['indicador_id' => $indicador], ['ordem' => 100]]);

                ColetaAlternativa::updateAll(['status' => ColetaAlternativa::INATIVO], ['and', ['indicador_id' => $indicador], ['interpolacao_absoluto' => $valor]]);
            }

            if ($valid) {
                $coletaIndicador = ColetaIndicador::findOne($indicador);

                if (!$coletaIndicador) {
                    $valid = false;
                    $msg = "Indicador não encontrado";
                }
            }

            if ($valid) {
                $cardinal = Coleta::calculaInterpolacaoLinear($coletaIndicador->verticalIndicador, $valor, $coletaIndicador);

                $bn = '';
                if ($cardinal === 100) {
                    $bn = 'B';
                }
                if ($cardinal === 0) {
                    $bn = 'N';
                }

                $coletaAlternativa = new ColetaAlternativa();
                $coletaAlternativa->status = ColetaAlternativa::ATIVO;
                $coletaAlternativa->indicador_id = $indicador;
                $coletaAlternativa->nome = str_replace(".", ",", $valor) . $texto;
                $coletaAlternativa->ordem = 100;
                $coletaAlternativa->nivel_esforco = 1;
                $coletaAlternativa->nivel_referencia = $cardinal;
                $coletaAlternativa->nivel_referencia_bn = $bn;
                $coletaAlternativa->selecionado = ColetaAlternativa::SELECIONADO;
                $coletaAlternativa->created_by = Yii::$app->user->identity->id ?? null;
                $coletaAlternativa->created_at = date('Y-m-d H:i:s');
                $coletaAlternativa->interpolacao_absoluto = $valor;

                if (!$coletaAlternativa->save()) {
                    $valid = false;
                    $msg = Json::encode($coletaAlternativa->getErrors());
                }
            }

            if ($valid) {
                $transaction->commit();
                return Json::encode(array('status' => 'success', 'type' => 'success', 'message' => "Resposta salva com sucesso"));
            } else {
                $transaction->rollback();
                return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => $msg));
            }
        } catch (Exception $e) {
            $transaction->rollback();
            throw new HttpException(500, $e->getMessage());
        }
    }
}
