<?php

namespace app\modules\performance\controllers;

ini_set('max_execution_time', 600); //300 seconds = 5 minutes

use Yii;
use app\modules\performance\models\Contexto;
use app\modules\performance\models\Cliente;
use app\modules\performance\models\Timeline;
use app\modules\performance\models\Configuracao;
use app\modules\performance\models\Coleta;
use app\modules\performance\models\ColetaAlternativa;
use app\modules\performance\models\ColetaIndicador;
use app\modules\performance\models\ColetaEstrutura;
use app\modules\performance\models\ParecerTecnicoColeta;
use app\modules\performance\models\RecomendacaoSeguranca;
use app\modules\performance\models\Anexo;
use app\modules\performance\models\Foto;
use app\modules\performance\models\ContextoTemContato;
use app\modules\performance\models\ContextoTemParametro;
use app\modules\performance\models\ContextoTemServico;
use app\modules\performance\models\ClienteTemParametro;
use app\modules\performance\models\Projeto;
use app\modules\performance\models\Aplicacao;
use app\modules\performance\models\AplicacaoSearch;
use app\modules\performance\models\AplicacaoTemProjeto;
use app\modules\performance\models\ClienteTemDocs;
use app\modules\performance\models\UnidadeNegocio;
use app\modules\performance\models\GppTemp;
use app\modules\performance\models\GppCausaProvavel;
use app\modules\performance\models\GppAcaoProposta;
use app\modules\performance\models\GppTarefa;
use app\modules\performance\models\VerticalGrupo;
use app\modules\performance\models\Vertical;
use app\modules\performance\models\VerticalIndicador;
use app\modules\performance\models\VerticalEstrutura;
use app\modules\performance\models\VerticalIndicadorTemParametro;
use app\modules\performance\models\PlanoAcao;
use app\modules\performance\models\CausaProvavel;
use app\modules\performance\models\AcaoProposta;
use app\models\Licenca;
use yii\helpers\ArrayHelper;
use app\controllers\BaseController;
use yii\web\HttpException;
use app\components\Utils;
use yii\helpers\Json;
use yii\helpers\Url;
use yii\db\Query;
use app\modules\performance\models\ContextoSearch;
use app\modules\performance\models\ClienteTemUsuario;
use app\modules\performancepp\models\PhpspUsers;
use app\modules\performance\models\PhpspUsersClientes;
use app\models\User;
use app\models\Municipio;
use app\modules\performance\models\UsuarioAutorizacao;
use app\modules\performance\models\ClienteTemServico;
use app\modules\performance\models\PesePlanoAplicacao;
use app\modules\performance\models\PeseSegmento;
use app\models\PeseEquipamento;
use app\modules\performance\models\PesePlanoAplicacaoEquipamento;
use yii\data\ArrayDataProvider;
use app\components\Logged;
use app\models\Apontamento;
use app\models\Apuracao;
use app\models\ApuracaoSearch;
use app\models\EmailTemplate;
use app\models\Estado;
use app\models\UserHasResource;
use app\models\GenericSearch;
use app\models\InventarioDados;
use app\models\InventarioScope;
use app\models\Scope;
use app\models\Wildcard;
use app\modules\operational\models\Ativo;
use app\modules\operational\models\AtivosChecklistSearch;
use app\modules\operational\models\AtivoStatus;
use app\modules\operational\models\ChecklistAtivos;
use app\modules\operational\models\ChecklistHumanasSearch;
use app\modules\operational\models\Local;
use app\modules\operational\models\Ocorrencia;
use app\modules\operational\models\OcorrenciaOrigem;
use app\modules\operational\models\OcorrenciaSearch;
use app\modules\operational\models\OcorrenciaSubtipo;
use app\modules\operational\models\Status;
use app\modules\performance\models\ClienteTemModulo;
use app\modules\performance\models\ClienteTemVertical;
use app\modules\performance\models\ContextoNatureza;
use app\modules\performance\models\ContextoTemModeloRisco;
use app\modules\performance\models\ContextoTemModulo;
use app\modules\performance\models\ProjetoTemFaixa;
use app\modules\performance\models\ProjetoTemVertical;
use app\modules\risk\models\RiscoModelo;
use app\modules\risk\models\RiscoCenario;
use app\modules\risk\models\Risco;
use Exception;
use phpDocumentor\Reflection\Types\Array_;
use yii\filters\VerbFilter;
use yii\web\UploadedFile;

class ContextoController extends BaseController
{

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

    public function actionIndex()
    {

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

        if (!\app\models\TermosUso::jaAceitouTermo(\Yii::$app->user->identity->id, null)) {
            \yii\helpers\Url::remember();
            $this->redirect('/termos-uso/aceite')->send();
            exit();
        }

        $isCeon = Logged::isCeon();

        if ($isCeon) {
            $this->redirect('/performance/contexto/gestao')->send();
        }

        $aplicacao = Aplicacao::find()
            ->join('LEFT JOIN', 'unidade_negocio', 'unidade_negocio.id=aplicacao.unidade_negocio_id')
            ->join('LEFT JOIN', 'cliente', 'cliente.id=unidade_negocio.cliente_id')
            ->join('LEFT JOIN', 'user_has_resource', 'cliente.id = user_has_resource.resource_id')
            ->where([
                'user_has_resource.user_id' => \Yii::$app->user->identity->id,
                'user_has_resource.role' => \app\models\UserHasResource::NV_CP_CLIENTE_ADM,
                'cliente.status' => Cliente::ATIVO,
                'unidade_negocio.status' => UnidadeNegocio::ATIVO,
                'aplicacao.status' => Aplicacao::ATIVO,
            ])
            ->one();

        $searchModel = new \app\modules\performance\models\ContextoSearch();

        $projetos = [];
        foreach ($aplicacao->aplicacaoTemProjetos as $aplicacaoTemProjeto) {
            $projetos[] = $aplicacaoTemProjeto->projeto_id;
        }

        if (property_exists($aplicacao->search_model, 'cliente_id')) {
            $searchModel->cliente_id = $aplicacao->unidadeNegocio->cliente_id;
        }

        $searchModel->aplicacaoProjetos = $projetos;

        $searchModel->cliente_id = $aplicacao->unidadeNegocio->cliente_id ?? null;

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

        $filters = [];
        //Utils::debug($aplicacao);

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

    public function actionGestao()
    {

        \app\models\Base::loga("Acessou a gestão dos Contextos", $_GET, $_POST, 46);

        $obj = new Contexto();

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

        if (!Logged::isCeon()) {
            $clientes = ArrayHelper::map(
                Cliente::find()
                    ->where(['status' => Cliente::ATIVO])
                    ->andWhere(['in', 'id', $meusClientesContextos])
                    ->all(),
                'id',
                'nome'
            );
        } else {
            $clientes = ArrayHelper::map(
                Cliente::find()
                    ->where(['status' => Cliente::ATIVO])
                    ->all(),
                'id',
                'nome'
            );
        }

        $clienteSelecionado = new Cliente();
        if (isset($_GET['Contexto']['clientesearch'])) {

            if (!isset($clientes[$_GET['Contexto']['clientesearch']])) {
                throw new HttpException(500, "Cliente não pertence ao seu escopo");
            }

            $clienteSelecionado = Cliente::findOne($_GET['Contexto']['clientesearch']);

            $contextos = GenericSearch::filterMyContextosVisualizacao()
                ->query
                ->andWhere('rgt-lft=1')
                ->andWhere(['cliente_id' => isset($_GET['Contexto']['clientesearch']) ? $_GET['Contexto']['clientesearch'] : '',])
                ->andwhere(['=', 'active', Contexto::ATIVO])
                ->asArray()
                ->all();
        } else {

            $contextos = [];
            $_GET['Contexto']['clientesearch'] = '';
        }

        //$aplicacoes = [];       

        if (count($clientes) == 1) {
            $_GET['Contexto']['clientesearch'] = array_key_first($clientes);

            $contextos = GenericSearch::filterMyContextosVisualizacao()
                ->query
                ->andWhere('rgt-lft=1')
                ->andWhere(['cliente_id' => array_key_first($clientes)])
                ->andwhere(['=', 'active', Contexto::ATIVO])
                ->asArray()
                ->all();
        }
        //Utils::debug($_GET['Contexto']['clientesearch']);

        $contextosExistentes = GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->andWhere('rgt-lft=1')
            ->andWhere(['cliente_id' => array_key_first($clientes)])
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->where(['cliente_id' => isset($_GET['Contexto']['clientesearch']) ? $_GET['Contexto']['clientesearch'] : '', 'active' => Contexto::ATIVO])
            ->addOrderBy('root, lft')
            ->count();

        $meusContextosGestor = GenericSearch::filterMyContextosVisualizacao()
            ->query
            //->select('id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'active', Contexto::ATIVO])
            ->andwhere(['=', 'cliente_id', $_GET['Contexto']['clientesearch']])
            ->all();

        $contextosTree = [];
        foreach ($meusContextosGestor as $meuContextoGestor) {
            $contextosTree[] = $meuContextoGestor->id;
            $parents = $meuContextoGestor->parents()->all();
            foreach ($parents as $parent) {
                if ($parent->active == Contexto::ATIVO) {
                    $contextosTree[] = $parent->id;
                }
            }
        }
        // Utils::debug($meusContextosGestor->parents()->all());        

        Url::remember();
        return $this->render('gestao', [
            'contextos' => $contextos,
            'obj' => $obj,
            'clientes' => $clientes,
            'contextosExistentes' => $contextosExistentes,
            'meusContextosGestor' => $meusContextosGestor,
            'contextoSearch' => $_GET['Contexto']['clientesearch'],
            'contextosTree' => $contextosTree,
        ]);
    }

    public function actionMapa()
    {

        \app\models\Base::loga("Acessou o mapa de Contextos", $_GET, $_POST, 47);

        $model = new Contexto();

        if (isset($_SESSION['cliente_id'])) {

            if (!isset($_GET['Contexto']['clientesearch'])) {

                if (isset($_SESSION['cliente_id'])) {
                    $_GET['Contexto']['clientesearch'] = $_SESSION['cliente_id'];
                }
            } else {

                if ($_GET['Contexto']['clientesearch'] != $_SESSION['cliente_id']) {

                    if (isset($_SESSION['cliente_id'])) {
                        $_GET['Contexto']['clientesearch'] = $_SESSION['cliente_id'];
                    }
                }
            }

            $contextos = null;

            if (isset($_SESSION['vinculo'])) {

                if (!empty($_SESSION['vinculo'])) {
                    $menorLvl = Contexto::find()->select('min(lvl) as lvl')->where(['active' => Contexto::ATIVO])->andWhere(['in', 'id', explode(",", $_SESSION['vinculo'])])->andWhere(['=', 'cliente_id', $_SESSION['cliente_id']])->column();

                    $contextos = Contexto::find()->where(['lvl' => $menorLvl, 'active' => Contexto::ATIVO])->andwhere(['in', 'id', explode(",", $_SESSION['vinculo'])])->andWhere(['cliente_id' => $_SESSION['cliente_id']])->all();
                } else {
                    $contextos = Contexto::find()->where(['lvl' => 0, 'active' => Contexto::ATIVO])->andWhere(['cliente_id' => $_SESSION['cliente_id']])->all();
                }
            } else {
                $contextos = Contexto::find()->where(['lvl' => 0, 'active' => Contexto::ATIVO])->andWhere(['cliente_id' => $_SESSION['cliente_id']])->all();
            }

            //Utils::debug($contextos);
        } elseif (isset($_SESSION['isCISI'])) {

            $_GET['Contexto']['clientesearch'] = $_SESSION['isCISI'][0];

            //->andWhere(['=', 'cliente_id', $_SESSION['isCISI'][0]])
            $contextos = Contexto::find()->where(['lvl' => 0, 'active' => Contexto::ATIVO])->andWhere(['cliente_id' => $_SESSION['isCISI']])->all();
        } else {

            if (isset($_GET['Contexto']['clientesearch'])) {

                $contextos = Contexto::find()->where(['lvl' => 0])->andWhere(['cliente_id' => isset($_GET['Contexto']['clientesearch']) ? $_GET['Contexto']['clientesearch'] : '',])->andWhere(['=', 'active', 1])->all();
            } else {

                $contextos = [];
            }
        }

        $alerta = [];

        $clientesMapa = [];

        $niveisValorGlobal = [];

        $tem = false;

        $faixasCliente = null;

        if (isset($_GET['Contexto']['clientesearch'])) {
            //pesquisando cliente               
            $faixasCliente = \app\models\ClienteTemFaixa::find()
                ->where([
                    'cliente_id' => $_GET['Contexto']['clientesearch'],
                ])
                ->all();
        }
        if ($faixasCliente) {
            $tem = true;
            $niveisValorGlobal = [];
            foreach ($faixasCliente as $faixa) {
                $niveisValorGlobal[] = ["from" => $faixa->de, "to" => $faixa->ate, "color" => $faixa->cor];
            }
        }

        if (!$tem) {
            $niveisValorGlobal = \app\models\Base::faixasPadrao();
        }

        if (isset($_GET['Contexto']['clientesearch'])) {
            if ($_GET['Contexto']['clientesearch'] == Cliente::ID_UNIMED) {
                $niveisValorGlobal = [];
                $niveisValorGlobal[] = ["from" => -1000, "to" => 45, "color" => "#DF5353"];
                $niveisValorGlobal[] = ["from" => 46, "to" => 80, "color" => "#e8dd11"];
                $niveisValorGlobal[] = ["from" => 81, "to" => 1000, "color" => "#089f50"];
            }

            if ($_GET['Contexto']['clientesearch'] == Contexto::ID_ORSEGUPS) {
                $niveisValorGlobal = [];
                $niveisValorGlobal[] = ["from" => -100, "to" => 45, "color" => "#DF5353"];
                $niveisValorGlobal[] = ["from" => 46, "to" => 79, "color" => "#e8dd11"];
                $niveisValorGlobal[] = ["from" => 80, "to" => 200, "color" => "#089f50"];
            }
        }


        foreach ($contextos as $contexto) {

            if (!isset($contexto->latitude) or !isset($contexto->longitude)) {
                $alerta[] = $contexto->name;
            } else {

                $link = '';
                $ehContexto = 0;
                if (($contexto->rgt - $contexto->lft) == 1) {
                    $link = $contexto->id;
                    $ehContexto = 1;
                }

                $pontuacao = $contexto->valorGlobal;

                foreach ($niveisValorGlobal as $key => $value) {
                    if ((is_string($value["from"]) ? $pontuacao : (float) $pontuacao) >= $value["from"] && (is_string($value["to"]) ? $pontuacao : (float) $pontuacao) <= $value["to"]) {

                        $icone = str_replace("#", "", $value["color"]);
                    }
                }

                if (!$pontuacao || !isset($pontuacao)) {
                    $icone = 'cinza';
                }

                $clientesMapa[] = [
                    'id' => $contexto->id,
                    'cliente_id' => $contexto->cliente->id,
                    'clienteLat' => $contexto->latitude,
                    'clienteLng' => $contexto->longitude,
                    'clienteNome' => $contexto->nome_alternativo ? $contexto->nome_alternativo : $contexto->name,
                    'link' => $link,
                    'ehContexto' => $ehContexto,
                    'icone' => $icone,
                ];
            }
        }
        // Utils::debug($clientesMapa);
        $obj = new Contexto();

        if (isset($_SESSION['cliente_id'])) {

            $clientes = ArrayHelper::map(Cliente::find()->where(['status' => Cliente::ATIVO])->andWhere(['=', 'id', $_SESSION['cliente_id']])->orderBy('nome ASC')->all(), 'id', 'nome');
        } elseif (isset($_SESSION['isCISI'])) {

            $clientes = ArrayHelper::map(Cliente::find()->where(['status' => Cliente::ATIVO])->andWhere(['in', 'id', $_SESSION['isCISI']])->orderBy('nome ASC')->all(), 'id', 'nome');
        } else {

            $clientes = ArrayHelper::map(Cliente::find()->where(['status' => Cliente::ATIVO])->orderBy('nome ASC')->all(), 'id', 'nome');
        }

        if (isset($_GET['debugmapa'])) {
            \app\component\Utils::debug(${$_GET['debugmapa']});
        }
        return $this->render('mapa', [
            'model' => $model,
            'clientesMapa' => $clientesMapa,
            'alerta' => $alerta,
            'obj' => $obj,
            'clientes' => $clientes,
            'alerta' => $alerta,
        ]);
    }

    /**
     * Displays a single Blog model as an ajax response.
     * @param integer $id
     * @return mixed
     */
    public function actionAjaxView($id)
    {

        \app\models\Base::loga("Acessou a visualização de Contexto via ajax", $_GET, $_POST, 35);

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

        if (!$model) {
            return '<div class="alert alert-danger">Erro! Contexto excluído!</div>';
        }

        if (isset($_SESSION['cliente_id'])) {

            if (!in_array($model->cliente_id, $_SESSION['cliente_id'])) {
                throw new httpException(500, "Erro! Cliente do Contexto não pertence a seu escopo!</div>");
            }


            if (isset($_SESSION['vinculo']))
                if (!in_array($model->id, $_SESSION['vinculo'])) {
                    throw new httpException(500, "Erro! Contexto não pertence a seu escopo! STC</div>");
                }
        }

        if ($model->active == Contexto::ATIVO) {

            $timelines = Timeline::find()->where(['tipo' => Timeline::TIPO_CONTEXTO, 'vinculo' => $model->id, 'status' => Timeline::ATIVO])->orderBy('data_cadastro DESC')->all();

            //            $plotBandGaugePrincipal = Configuracao::find()
            //                    ->where([
            //                        'chave' => 'plotBandGaugePrincipal',
            //                        'status' => Configuracao::ATIVO,
            //                    ])
            //                    ->one();

            $pareceresTecnicos = ParecerTecnicoColeta::find()
                ->joinWith('coleta')
                ->joinWith(['createdBy', 'updatedBy update'])
                //->joinWith('updatedBy as update')
                ->where([
                    'coleta.contexto_id' => $model->id,
                    'parecer_tecnico_coleta.status' => ParecerTecnicoColeta::ATIVO
                ])
                ->orderBy('id DESC')
                ->asArray()
                ->all();

            $recomendacoesSeguranca = RecomendacaoSeguranca::find()
                ->joinWith(['createdBy'])
                ->where([
                    'contexto_id' => $model->id,
                    'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
                ])
                ->orderBy('prioridade ASC, id ASC')
                ->asArray()
                ->all();

            $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

            $anexos = Anexo::find()
                ->joinWith(['createdBy'])
                ->where([
                    'contexto_id' => $model->id,
                    'anexo.status' => Anexo::ATIVO
                ])
                ->orderBy('id ASC')
                ->asArray()
                ->all();

            $queryFotos = new Query;
            $queryFotos->select(['foto.id AS id', 'foto.nome AS nome', 'foto.arquivo AS arquivo', 'user.nome AS autor'])
                ->from('foto')
                ->where('foto.status = 1 AND coleta.status = 1 AND contexto.active =1')
                ->leftJoin('user', 'user.id = foto.created_by')
                ->leftJoin('coleta', 'coleta.id = foto.coleta_id')
                ->leftJoin('contexto', 'contexto.id = coleta.contexto_id');

            $commandFotos = $queryFotos->createCommand();
            $fotos = $commandFotos->queryAll();


            $cenario = null;
            $riscosCenario = null;
            $consequenciasValores = null;
            $probabilidadesValores = null;
            $riscosGrafico = null;

            $coletas = Coleta::find()->select('id')->where(['contexto_id' => $model->id, 'status' => Coleta::ATIVO])->column();

            $cenarios = RiscoCenario::find()->where(['status' => RiscoCenario::ATIVO])->andWhere(['in', 'coleta_vinculo', $coletas])->all();

            if (count($cenarios) == 1) {
                $cenario = RiscoCenario::find()->where(['status' => RiscoCenario::ATIVO])->andWhere(['in', 'coleta_vinculo', $coletas])->one();

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

                    $riscosGrafico = [];
                    $i = 1;
                    foreach ($riscosCenario as $riscoCenario) {
                        $riscosGrafico[] = 'R' . $i;
                        $i++;
                    }

                    $consequenciasValores = RiscoCenario::consequenciaValores($cenario);

                    $probabilidadesValores = RiscoCenario::probabilidadeValores($cenario);
                } else {

                    $riscosCenario = null;

                    $consequenciasValores = null;

                    $probabilidadesValores = null;

                    $riscosGrafico = [];
                }
            }

            $origem = 'ajax';

            $contatos = '<table width=200px>';
            foreach ($model->contextoTemContatos as $contextoContato) {
                if ($contextoContato->status == ContextoTemContato::ATIVO) {
                    $contatos .= "<tr><td style='text-align:left'>" . $contextoContato->contato . "</td></tr>";
                }
            }
            $contatos .= '</table>';

            $parametros = ContextoTemParametro::find()->where(['contexto_id' => $model->id, 'status' => ContextoTemParametro::ATIVO,])->asArray()->all();

            $servicosContratados = ContextoTemServico::find()->select('servico')->where(['contexto_id' => $model->id, 'status' => ContextoTemServico::ATIVO,])->column();

            //$projetos = Projeto::dadosContexto($model);
            $projetos = Projeto::dadosContextoMermaid($model);

            if (isset($_GET['utils'])) {

                Utils::debug($projetos);
            }

            return $this->renderPartial('_view', [
                'model' => $model,
                'timelines' => $timelines,
                //'plotBandGaugePrincipal' => $plotBandGaugePrincipal->valor,
                'pareceresTecnicos' => $pareceresTecnicos,
                'recomendacoesSeguranca' => $recomendacoesSeguranca,
                'prioridades' => $prioridades,
                'anexos' => $anexos,
                'fotos' => $fotos,
                'cenario' => $cenario,
                'riscosCenario' => $riscosCenario,
                'consequenciasValores' => $consequenciasValores,
                'probabilidadesValores' => $probabilidadesValores,
                'riscosGrafico' => $riscosGrafico,
                'origem' => $origem,
                'botoes' => false,
                'contatos' => $contatos,
                'parametros' => $parametros,
                'servicosContratados' => $servicosContratados,
                'projetos' => $projetos,
            ]);
        } else {

            return '<div class="alert alert-danger">Erro! Contexto excluído!</div>';
        }
    }

    /**
     * Displays a single Blog model as an ajax response.
     * @param integer $id
     * @return mixed
     */
    public function actionAjaxMapa($id)
    {

        \app\models\Base::loga("Acessou a visualização de mapa dos Contextos via ajax", $_GET, $_POST, 35);

        $escolhido = Contexto::find()->where(['id' => $id, 'active' => 1])->one();

        if (!$escolhido) {

            if (isset($_SESSION['cliente_id'])) {
                if (!$_GET['cliente_id'] != $_SESSION['cliente_id']) {

                    $_GET['cliente_id'] = $_SESSION['cliente_id'];
                }
            }

            if (isset($_GET['cliente_id'])) {
                $contextos = Contexto::find()->where(['lvl' => 0])->andWhere(['cliente_id' => isset($_GET['cliente_id']) ? $_GET['cliente_id'] : '',])->andWhere(['=', 'active', 1])->all();
            } else {
                return '<div class="alert alert-danger">Escolha um cliente</div>';
            }
        } else {


            if (isset($_SESSION['cliente_id'])) {

                if ($escolhido->cliente_id != $_SESSION['cliente_id']) {
                    $escolhido = Contexto::find()->where(['cliente_id' => $_SESSION['cliente_id'], 'active' => 1])->one();
                }

                $ehContexto = $escolhido->rgt - $escolhido->lft;

                $contextos = null;


                if ($_SESSION['todosContextos'] == 'sim') {


                    if ($ehContexto == 1) {

                        //$contextos = Contexto::find()->Where(['id' => $id])->andWhere(['=', 'active', 1])->all();
                        return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $escolhido->cliente_id, 'id' => $escolhido->id, 'origem' => 'mapa']);
                        exit();
                    } else {

                        //$contextos = Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'root', $escolhido->root])->andWhere(['=', 'active', 1])->asArray()->all();
                        $contextos = $escolhido->children(1)->andWhere(['=', 'active', Contexto::ATIVO])->all();
                    }
                } else {

                    $itensEstrutura = [];

                    $contextosAutorizados = Contexto::find()->where(['active' => Contexto::ATIVO])->andwhere(['in', 'id', $_SESSION['contextosAutorizados']])->all();

                    foreach ($contextosAutorizados as $contextoAutorizado) {

                        $itensEstrutura[] = $contextoAutorizado->id;

                        $b = $contextoAutorizado->parents()->all();

                        foreach ($b as $value) {
                            $itensEstrutura[] = $value->id;
                        }
                    }

                    if ($ehContexto == 1) {

                        if (in_array($id, $itensEstrutura)) {
                            $contextos = Contexto::find()->Where(['id' => $id])->andWhere(['=', 'active', 1])->all();
                        }
                    } else {

                        $contextos = $escolhido->children(1)->andwhere(['in', 'id', $itensEstrutura])->andWhere(['=', 'active', Contexto::ATIVO])->all();
                    }
                }


                if (isset($_SESSION['responsavel'])) {

                    if ($ehContexto == 1) {

                        if (in_array($escolhido->cliente_id, $_SESSION['responsavel'])) {
                            $contextos = Contexto::find()->Where(['id' => $id])->andWhere(['=', 'active', 1])->all();
                        }
                    } else {

                        $contextos = $escolhido->children(1)->andwhere(['in', 'cliente_id', $_SESSION['responsavel']])->andWhere(['=', 'active', Contexto::ATIVO])->all();
                    }
                }
            } else {

                $ehContexto = $escolhido->rgt - $escolhido->lft;

                if ($ehContexto == 1) {

                    //$contextos = Contexto::find()->Where(['id' => $id])->andWhere(['=', 'active', 1])->all();
                    return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $escolhido->cliente_id, 'id' => $escolhido->id, 'origem' => 'mapa']);
                    exit();
                } else {

                    //$contextos = Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'root', $escolhido->root])->andWhere(['=', 'active', 1])->asArray()->all();
                    $contextos = $escolhido->children(1)->andWhere(['=', 'active', Contexto::ATIVO])->all();
                }
            }
        }

        //\app\component\Utils::debug($contextos);

        $alerta = [];

        $clientesMapa = [];

        $niveisValorGlobal = [];

        $tem = false;

        $faixasCliente = null;

        if (isset($_GET['cliente_id'])) {
            //pesquisando cliente               
            $faixasCliente = \app\models\ClienteTemFaixa::find()
                ->where([
                    'cliente_id' => $_GET['cliente_id'],
                ])
                ->all();
        }
        if ($faixasCliente) {
            $tem = true;
            $niveisValorGlobal = [];
            foreach ($faixasCliente as $faixa) {
                $niveisValorGlobal[] = ["from" => $faixa->de, "to" => $faixa->ate, "color" => $faixa->cor];
            }
        }

        if (!$tem) {
            $niveisValorGlobal = \app\models\Base::faixasPadrao();
        }

        if (isset($_GET['cliente_id'])) {
            if ($_GET['cliente_id'] == Cliente::ID_UNIMED) {
                $niveisValorGlobal = [];
                $niveisValorGlobal[] = ["from" => -1000, "to" => 45, "color" => "#DF5353"];
                $niveisValorGlobal[] = ["from" => 46, "to" => 80, "color" => "#e8dd11"];
                $niveisValorGlobal[] = ["from" => 81, "to" => 1000, "color" => "#089f50"];
            }

            if ($_GET['cliente_id'] == Contexto::ID_ORSEGUPS) {
                $niveisValorGlobal = [];
                $niveisValorGlobal[] = ["from" => -100, "to" => 45, "color" => "#DF5353"];
                $niveisValorGlobal[] = ["from" => 46, "to" => 79, "color" => "#e8dd11"];
                $niveisValorGlobal[] = ["from" => 80, "to" => 200, "color" => "#089f50"];
            }
        }

        foreach ($contextos as $contexto) {

            if (!isset($contexto->latitude) or !isset($contexto->longitude)) {
                $alerta[] = $contexto->name;
            } else {

                $link = '';
                $ehContexto = 0;
                if (($contexto->rgt - $contexto->lft) == 1) {
                    $link = $contexto->id;
                    $ehContexto = 1;
                }


                $pontuacao = $contexto->valorGlobal;




                foreach ($niveisValorGlobal as $key => $value) {
                    if ((is_string($value["from"]) ? $pontuacao : (float) $pontuacao) >= $value["from"] && (is_string($value["to"]) ? $pontuacao : (float) $pontuacao) <= $value["to"]) {

                        $icone = str_replace("#", "", $value["color"]);
                    }
                }

                if (!$pontuacao) {
                    $icone = 'cinza';
                }

                //                if (!$contexto->pontuacao) {
                //                    $icone = 'cinza';
                //                } elseif ($contexto->pontuacao <= 40) {
                //                    $icone = 'vermelho';
                //                } elseif ($contexto->pontuacao <= 80) {
                //                    $icone = 'amarelo';
                //                } else {
                //                    $icone = 'verde';
                //                }

                $clientesMapa[] = [
                    'id' => $contexto->id,
                    'cliente_id' => $contexto->cliente->id,
                    'clienteLat' => $contexto->latitude,
                    'clienteLng' => $contexto->longitude,
                    'clienteNome' => $contexto->name,
                    'link' => $link,
                    'ehContexto' => $ehContexto,
                    'icone' => $icone,
                ];
            }
        }

        return $this->renderPartial('_mapa', [
            'clientesMapa' => $clientesMapa,
            'alerta' => $alerta,
        ]);
    }

    public function actionListaColetasPossiveis()
    {

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

                $list = Coleta::find()->where(['contexto_id' => $contextoId, 'status' => Coleta::ATIVO])->orderBy('id DESC')->all();
                $selected = null;
                if ($contextoId != 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 = [];

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

                            if ($coleta) {

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

    public function actionProcessaPontuacao($id)
    {

        \app\models\Base::loga("Processou a pontuação dos Contextos do Cliente", $_GET, $_POST, 35);

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

        foreach ($contextos as $contexto) {
            //Contexto::geraPontuacao($contexto);
            Contexto::geraPontuacaoEstrutura($contexto);
            //Utils::debug($contexto);
        }

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

    public function actionProcessaPontuacaoContexto($id)
    {

        \app\models\Base::loga("Processou a pontuação do Contexto", $_GET, $_POST, 35);

        $contexto = Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'id', $id])->andWhere(['=', 'active', 1])->one();

        if ($contexto) {
            Contexto::geraPontuacao($contexto);

            return $this->redirect(['gestao', 'Contexto[clientesearch]' => $contexto->cliente_id]);
        }

        throw new HttpException(500, "Contexto não encontrado");
    }

    public function actionAnalise()
    {

        \app\models\Base::loga("Acessou a análise dos Contextos", $_GET, $_POST, 35);

        $searchModel = new ContextoSearch();

        if (!$searchModel->active) {
            $searchModel->active = Contexto::ATIVO;
        }

        if ($_SESSION['isAdmin'] != 'admin') {

            $clientesUsuario = ClienteTemUsuario::find()
                ->select('cliente_id')
                ->where([
                    'usuario_id' => Yii::$app->user->identity->id,
                    'status' => ClienteTemUsuario::ATIVO
                ])
                ->column();

            $contextos = ArrayHelper::map(Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'active', 1])->andwhere(['in', 'cliente_id', $clientesUsuario])->orderBy('name')->all(), 'name', 'name');
        } else {
            $contextos = ArrayHelper::map(Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'active', 1])->all(), 'name', 'name');
        }



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

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

    public function actionDelete($id, $origem = 1)
    {

        \app\models\Base::loga("Excluiu Contexto", $_GET, $_POST, 48);

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

        $model->active = Contexto::INATIVO;

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


        if ($origem == 3) {
            return $this->redirect(['/performance/default/gestor', 'tab' => $model->cliente_id])->send();
        }
        if ($origem == 2) {
            return $this->redirect(['/performance/cliente/view', 'id' => $model->cliente_id])->send();
        }

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

    public function actionMembroMpsc()
    {

        return false;

        $contexto = new Contexto();

        $user = new User();

        $mpscMembroLocal = new MpscMembroLocal();

        $phpUsers = new PhpspUsers();

        $phpUsersClientes = new PhpspUsersClientes();

        $municipios = ArrayHelper::map(Municipio::find()->where(['status' => Municipio::ATIVO])->all(), 'id', 'nomeEstado');

        return $this->render('_form_membro_mpsc', [
            'contexto' => $contexto,
            'user' => $user,
            'phpUsers' => $phpUsers,
            'municipios' => $municipios,
        ]);
    }

    public function actionUpdateParametroAjax($id)
    {

        \app\models\Base::loga("Acessou a edição  ajax do Parâmetro", $_GET, $_POST);

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

        if (!$model) {
            return 'Parâmetro não encontrado';
            exit();
        }

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

        $this->layout = 'simples';

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

            if ($model->save()) {
                Yii::$app->session->setFlash('success', 'Parâmetro atualizado com sucesso!');
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->contexto->cliente_id, 'id' => $model->contexto_id, 'origem' => 'mapa']);
            } else {
                Yii::$app->session->setFlash('danger', 'Erro ao atualizar o Parâmetro! Motivo: ' . json_encode($model->getErrors()));
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->contexto->cliente_id, 'id' => $model->contexto_id, 'origem' => 'mapa']);
            }
        }

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

    public function actionUpdateContatoAjax($id)
    {

        \app\models\Base::loga("Acessou a edição ajax do Contato", $_GET, $_POST);

        $model = Contexto::find()->where(['id' => $id, 'active' => Contexto::ATIVO])->one();

        if (!$model) {
            return 'Contexto não encontrado';
            exit();
        }

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

        $this->layout = 'simples';

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

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

            if ($_POST['ContextoTemContato']) {
                foreach ($_POST['ContextoTemContato']['contato'] as $contato) {
                    if (!empty($contato)) {
                        $novoContato = new ContextoTemContato();
                        $novoContato->contexto_id = $model->id;
                        $novoContato->contato = (string) $contato;
                        $novoContato->status = ContextoTemContato::ATIVO;
                        $novoContato->created_by = Yii::$app->user->identity->id ?? null;
                        $novoContato->created_at = date('Y-m-d H:i:s');

                        if (!$novoContato->save()) {
                            throw new \yii\web\HttpException(500, "Erro ao salvar o contato, motivo: " . json_encode($novoContato->getErrors()));
                        }
                    }
                }
            }

            if ($model->save()) {
                Yii::$app->session->setFlash('success', 'Contato atualizado com sucesso!');
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->cliente_id, 'id' => $model->id, 'origem' => 'mapa']);
            } else {
                Yii::$app->session->setFlash('danger', 'Erro ao atualizar o Contato! Motivo: ' . json_encode($model->getErrors()));
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->cliente_id, 'id' => $model->id, 'origem' => 'mapa']);
            }
        }

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

    public function actionDeleteParametroAjax($id)
    {

        \app\models\Base::loga("Acessou a exclusão ajax do Parâmetro", $_GET, $_POST);

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

        if (!$model) {
            return 'Parâmetro não encontrado';
            exit();
        }

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

        $model->status = ContextoTemParametro::INATIVO;

        if ($model->save()) {
            Yii::$app->session->setFlash('success', 'Parâmetro excluído com sucesso!');
            return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->contexto->cliente_id, 'id' => $model->contexto_id, 'origem' => 'mapa']);
        } else {
            Yii::$app->session->setFlash('danger', 'Erro ao excluir o Parâmetro! Motivo: ' . json_encode($model->getErrors()));
            return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->contexto->cliente_id, 'id' => $model->contexto_id, 'origem' => 'mapa']);
        }
    }

    public function actionUpdateServicoAjax($id)
    {

        \app\models\Base::loga("Acessou a edição ajax do Serviço Contratado", $_GET, $_POST);

        $model = Contexto::find()->where(['active' => Contexto::ATIVO, 'id' => $id])->one();

        if (!$model) {
            throw new HttpException(500, "Contexto não encontrado");
            exit();
        }


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

        $servicosPossiveis = ContextoTemServico::find()->select('servico')->where(['status' => ContextoTemServico::ATIVO])->groupBy('servico')->column();

        $servicosDisponiveis = ClienteTemServico::find()->where(['cliente_id' => $model->cliente_id, 'status' => ClienteTemServico::ATIVO])->groupBy('servico')->all();

        $servicosCadastrados = ContextoTemServico::find()->select('servico')->where(['contexto_id' => $model->id, 'status' => ContextoTemServico::ATIVO])->groupBy('servico')->column();


        $this->layout = 'simples';

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

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

            $valid = true;
            if (isset($_POST['Servicos'])) {
                if ($_POST['Servicos']) {
                    foreach ($_POST['Servicos']['servico'] as $servico) {
                        //\app\component\Utils::debug($_POST['ContextoTemParametro']);
                        if (!empty($servico)) {
                            $novoServico = new ContextoTemServico();
                            $novoServico->contexto_id = $model->id;
                            $novoServico->servico = (string) $servico;
                            $novoServico->status = ContextoTemServico::ATIVO;
                            $novoServico->created_by = Yii::$app->user->identity->id ?? null;
                            $novoServico->created_at = date('Y-m-d H:i:s');

                            if (!$novoServico->save()) {
                                $valid = false;
                                throw new \yii\web\HttpException(500, "Erro ao atualizar o serviço, motivo: " . json_encode($novoServico->getErrors()));
                            }
                        }
                    }
                }
            }

            if ($valid) {
                Yii::$app->session->setFlash('success', 'Parâmetro atualizado com sucesso!');
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->cliente_id, 'id' => $model->id, 'origem' => 'mapa']);
            } else {
                Yii::$app->session->setFlash('danger', 'Erro ao atualizar o Parâmetro! Motivo: ' . json_encode($model->getErrors()));
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->cliente_id, 'id' => $model->id, 'origem' => 'mapa']);
            }
        }

        return $this->render('_form_servico', [
            'model' => $model,
            'servicosPossiveis' => $servicosPossiveis,
            'servicosDisponiveis' => $servicosDisponiveis,
            'servicosCadastrados' => $servicosCadastrados,
        ]);
    }

    public function actionUpdateEnderecoAjax($id)
    {

        \app\models\Base::loga("Acessou a edição ajax do Endereço", $_GET, $_POST);

        $model = Contexto::find()->where(['active' => Contexto::ATIVO, 'id' => $id])->one();

        if (!$model) {
            throw new HttpException(500, "Contexto não encontrado");
            exit();
        }


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

        $this->layout = 'simples';

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

            if ($model->save()) {
                Yii::$app->session->setFlash('success', 'Parâmetro atualizado com sucesso!');
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->cliente_id, 'id' => $model->id, 'origem' => 'mapa']);
            } else {
                Yii::$app->session->setFlash('danger', 'Erro ao atualizar o Parâmetro! Motivo: ' . json_encode($model->getErrors()));
                return $this->redirect(['/contexto/view', 'Contexto[clientesearch]' => $model->cliente_id, 'id' => $model->id, 'origem' => 'mapa']);
            }
        }

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

    public function actionEspecialTemplateInicio($id, $token)
    {

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

        $contexto = Contexto::find()->where(['id' => $id, 'active' => Contexto::ATIVO])->one();

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

        $parametros = ContextoTemParametro::find()->where(['contexto_id' => $contexto->id, 'status' => ContextoTemParametro::ATIVO,])->asArray()->all();

        return $this->render('especial-template-inicio', [
            'contexto' => $contexto,
            'parametros' => $parametros,
        ]);
    }

    public function actionEspecialTemplateCenarioRisco($id, $token)
    {

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

        $contexto = Contexto::find()->where(['id' => $id, 'active' => Contexto::ATIVO])->one();

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

        $coletas = Coleta::find()->select('id')->where(['contexto_id' => $contexto->id, 'status' => Coleta::ATIVO])->column();

        $cenario = null;
        $riscosCenario = null;
        $consequenciasValores = null;
        $probabilidadesValores = null;
        $riscosGrafico = null;

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

        //if (count($cenarios) == 1) {
        //$cenario = RiscoCenario::find()->where(['status' => RiscoCenario::ATIVO])->andWhere(['in', 'coleta_vinculo', $coletas])->one();

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

            $riscosGrafico = [];
            $i = 1;
            foreach ($riscosCenario as $riscoCenario) {
                $riscosGrafico[] = 'R' . $i;
                $i++;
            }

            $consequenciasValores = RiscoCenario::consequenciaValores($cenario);

            $probabilidadesValores = RiscoCenario::probabilidadeValores($cenario);
        } else {

            $riscosCenario = null;

            $consequenciasValores = null;

            $probabilidadesValores = null;

            $riscosGrafico = [];
        }

        return $this->render('especial-template-cenario-risco', [
            'contexto' => $contexto,
            'cenario' => $cenario,
            'riscosCenario' => $riscosCenario,
            'consequenciasValores' => $consequenciasValores,
            'probabilidadesValores' => $probabilidadesValores,
            'riscosGrafico' => $riscosGrafico,
            'origem' => '',
            'botoes' => null,
            'permissoes' => null,
        ]);
    }

    public function actionEspecialTemplateRisco($id, $token, $risco)
    {

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

        $contexto = Contexto::find()->where(['id' => $id, 'active' => Contexto::ATIVO])->one();

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

        $coletas = Coleta::find()->select('id')->where(['contexto_id' => $contexto->id, 'status' => Coleta::ATIVO])->column();

        $cenario = null;
        $riscosCenario = null;
        $consequenciasValores = null;
        $probabilidadesValores = null;
        $riscosGrafico = null;

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

        //if (count($cenarios) == 1) {
        //$cenario = RiscoCenario::find()->where(['status' => RiscoCenario::ATIVO])->andWhere(['in', 'coleta_vinculo', $coletas])->one();

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

            $riscosGrafico = [];
            $i = 1;
            foreach ($riscosCenario as $riscoCenario) {
                $riscosGrafico[] = 'R' . $i;
                $i++;
            }

            $consequenciasValores = RiscoCenario::consequenciaValores($cenario);

            $probabilidadesValores = RiscoCenario::probabilidadeValores($cenario);
        } else {

            $riscosCenario = null;

            $consequenciasValores = null;

            $probabilidadesValores = null;

            $riscosGrafico = [];
        }

        return $this->render('especial-template-risco', [
            'contexto' => $contexto,
            'cenario' => $cenario,
            'riscosCenario' => $riscosCenario,
            'consequenciasValores' => $consequenciasValores,
            'probabilidadesValores' => $probabilidadesValores,
            'riscosGrafico' => $riscosGrafico,
            'origem' => '',
            'botoes' => null,
            'permissoes' => null,
            'risco' => $risco,
        ]);
    }

    public function actionOrsegupsAdicionaPostoAjax($contextoId, $postoId)
    {

        return false;

        $contexto = Contexto::find()->where(['id' => $contextoId, 'active' => Contexto::ATIVO])->one();

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

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

        $postoJaCadastrado = \app\models\OrsegupsContextoPosto::find()->where(['posto_id' => $postoId])->one();

        if ($postoJaCadastrado) {
            throw new HttpException(500, "Erro! Posto já cadastrado para o Contexto " . $postoJaCadastrado->contexto->name);
        }

        $posto = new \app\models\OrsegupsContextoPosto();
        $posto->contexto_id = $contexto->id;
        $posto->posto_id = $postoId;
        $posto->cliente_id = $contexto->cliente_id;

        if (!$posto->save()) {
            throw new HttpException(500, "Erro ao cadastrar o Posto no Contexto, motivo: " . json_encode($posto->getErrors()));
        }

        return $posto->id;
    }

    public function actionOrsegupsExcluiPostoAjax($contextoId, $postoId)
    {

        return false;

        $contexto = Contexto::find()->where(['id' => $contextoId, 'active' => Contexto::ATIVO])->one();

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

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

        $posto = \app\models\OrsegupsContextoPosto::find()->where(['contexto_id' => $contextoId, 'posto_id' => $postoId])->one();

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


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

        return 1;
    }

    public function actionView2($id)
    {

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

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

        //verificando se pode acessar os dados do contexto
        Contexto::permiteAcessar($model);

        $contatos = '';
        foreach ($model->contextoTemContatos as $contextoContato) {
            if ($contextoContato->status == ContextoTemContato::ATIVO) {
                $contatos .= $contextoContato->contato . "<br />";
            }
        }

        $parametros = ContextoTemParametro::find()
            ->where([
                'contexto_id' => $model->id,
                'status' => ContextoTemParametro::ATIVO,
            ])
            ->asArray()
            ->all();

        $servicosContratados = ContextoTemServico::find()
            ->select('servico')
            ->where([
                'contexto_id' => $model->id,
                'status' => ContextoTemServico::ATIVO,
            ])
            ->column();


        $permissoes = UsuarioAutorizacao::permissoesGerais();

        $coletasId = Coleta::find()
            ->select('max(id)')
            ->where([
                'contexto_id' => $id,
                'status' => Coleta::ATIVO
            ])
            ->groupBy('vertical_id')
            ->column();

        $coletasReferencia = Coleta::find()
            ->where([
                'in',
                'id',
                $coletasId
            ])
            ->all();

        $timelines = Timeline::find()->where(['tipo' => Timeline::TIPO_CONTEXTO, 'vinculo' => $model->id, 'status' => Timeline::ATIVO])->orderBy('data_cadastro DESC')->all();

        $pareceresTecnicos = ParecerTecnicoColeta::find()
            ->joinWith('coleta')
            ->joinWith(['createdBy', 'updatedBy update'])
            ->where([
                'coleta.contexto_id' => $model->id,
                'parecer_tecnico_coleta.status' => ParecerTecnicoColeta::ATIVO
            ])
            ->andWhere(['>', 'parecer_tecnico_coleta.created_at', '2019-08-15 08:00:00'])
            ->orderBy('id DESC')
            ->asArray()
            ->all();

        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $model->id,
                'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
            ])
            ->orderBy('prioridade ASC, id ASC')
            ->asArray()
            ->all();

        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

        $anexos = Anexo::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $model->id,
                'anexo.status' => Anexo::ATIVO
            ])
            ->orderBy('id ASC')
            ->asArray()
            ->all();

        $coletas = Coleta::find()->select('id')->where(['contexto_id' => $model->id, 'status' => Coleta::ATIVO])->column();

        $queryFotos = new Query;
        $queryFotos->select(['foto.id AS id', 'foto.nome AS nome', 'foto.arquivo AS arquivo', 'user.nome AS autor'])
            ->from('foto')
            ->where('foto.status = 1 AND coleta.status = 1 AND contexto.active =1')
            ->andwhere(['in', 'coleta.id', $coletas])
            ->leftJoin('user', 'user.id = foto.created_by')
            ->leftJoin('coleta', 'coleta.id = foto.coleta_id')
            ->leftJoin('contexto', 'contexto.id = coleta.contexto_id');

        $commandFotos = $queryFotos->createCommand();
        $fotos = $commandFotos->queryAll();

        $docsExiste = [];

        foreach ($model->cliente->clienteTemDocs as $clienteTemDoc) {
            if ($clienteTemDoc->status == ClienteTemDocs::ATIVO) {
                $docsExiste[] = $clienteTemDoc->doc;
            }
        }

        $cenario = null;
        $riscosCenario = null;
        $consequenciasValores = null;
        $probabilidadesValores = null;
        $riscosGrafico = null;

        $cenario = RiscoCenario::find()->where(['status' => RiscoCenario::ATIVO])->andWhere(['in', 'coleta_vinculo', $coletas])->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) {
                $riscosGrafico[] = 'R' . $i;
                $i++;
            }

            $consequenciasValores = RiscoCenario::consequenciaValores($cenario);

            $probabilidadesValores = RiscoCenario::probabilidadeValores($cenario);
        } else {

            $riscosCenario = null;

            $consequenciasValores = null;

            $probabilidadesValores = null;

            $riscosGrafico = [];
        }

        $pesePlanoAplicacaoFull = PesePlanoAplicacao::find()->where(['contexto_id' => $model->id, 'tipo' => PesePlanoAplicacao::FULL, 'status' => PesePlanoAplicacao::ATIVO])->one();
        $planoAplicacaoFull = '';

        $planoAplicacaoSegmentos = [];

        $idPeseFull = null;
        $idPeseBasic = null;

        if (!$pesePlanoAplicacaoFull) {
            $planoAplicacaoFull .= '<br /><div><i>Aguardando cadastro do Plano de Aplicação Full</i></div>';
        } else {

            $idPeseFull = $pesePlanoAplicacaoFull->id;

            $planoAplicacaoFull .= '<br />';

            $segmento = null;

            $segs = PeseSegmento::find()->where(['status' => PeseSegmento::ATIVO])->orderBy('descricao ASC')->all();


            foreach ($segs as $seg) {

                $planoAplicacaoFull .= '<br /><h4><b>' . $seg->descricao . '</h4></b></h4>';

                $planoAplicacaoFull .= PesePlanoAplicacao::subTotal($pesePlanoAplicacaoFull->id, $seg->id);

                $planoAplicacaoSegmentos[$seg->id] = $seg->descricao;

                $planoAplicacaoFull .= '
                    <table class="table table-bordered table-striped table-condensed">
                        <thead>
                            <th class="col-sm-2">Área de Preocupação</th>
			    <th class="col-sm-4">Ambiente</th>	
                            <th class="col-sm-4">Localização</th>
                            <th class="col-sm-1">Equipamento</th>
                            <th class="col-sm-1">Tag</th>
                        </thead>
                        <tbody>';



                $epql = PeseEquipamento::find()->select('id')->where(['pese_segmento_id' => $seg->id])->column();

                $epal = $equip1 = PesePlanoAplicacaoEquipamento::find()->where(['pese_plano_aplicacao_id' => $pesePlanoAplicacaoFull->id])->andWhere(['in', 'pese_equipamento_id', $epql])->orderby('area_preocupacao ASC, ordem ASC')->all();

                foreach ($epal as $e) {
                    $ap = [1 => 'Limites Perimetrais', 2 => 'Controle de Acessos', 3 => 'Áreas de Circulação', 4 => 'Ambientes Específicos'];

                    if (isset($ap[$e->area_preocupacao])) {
                        $a = $ap[$e->area_preocupacao];
                    } else {
                        $a = '';
                    }
                    $planoAplicacaoFull .= '<tr><td>' . $a . '</td><td>' . $e->ambiente . '</td><td>' . $e->localizacao . '</td><td>' . $e->peseEquipamento->descricao . '</td><td>' . $e->tag . '</td></tr>';
                }

                $planoAplicacaoFull .= '</tbody></table>';
            }
        }

        $pesePlanoAplicacaoBasic = PesePlanoAplicacao::find()->where(['contexto_id' => $model->id, 'tipo' => PesePlanoAplicacao::BASIC, 'status' => PesePlanoAplicacao::ATIVO])->one();
        $planoAplicacaoBasic = '';
        if (!$pesePlanoAplicacaoBasic) {

            $planoAplicacaoBasic .= '<br /><div><i>Aguardando cadastro do Plano de Aplicação Basic</i></div>';
        } else {

            $idPeseBasic = $pesePlanoAplicacaoBasic->id;

            $planoAplicacaoBasic .= '<br />';

            $segmento = null;

            $ep = '';

            $segs = PeseSegmento::find()->where(['status' => PeseSegmento::ATIVO])->orderBy('descricao ASC')->all();


            foreach ($segs as $seg) {

                $planoAplicacaoBasic .= '<br /><h4><b>' . $seg->descricao . '</h4></b></h4>';

                $planoAplicacaoBasic .= PesePlanoAplicacao::subTotal($pesePlanoAplicacaoBasic->id, $seg->id);

                $planoAplicacaoBasic .= '
                    <table class="table table-bordered table-striped table-condensed">
                        <thead>
                            <th class="col-sm-2">Área de Preocupação</th>
			    <th class="col-sm-4">Ambiente</th>	
                            <th class="col-sm-4">Localização</th>
                            <th class="col-sm-1">Equipamento</th>
                            <th class="col-sm-1">Tag</th>
                        </thead>
                        <tbody>';


                $epql = PeseEquipamento::find()->select('id')->where(['pese_segmento_id' => $seg->id])->column();

                $epal = $equip1 = PesePlanoAplicacaoEquipamento::find()->where(['pese_plano_aplicacao_id' => $pesePlanoAplicacaoBasic->id])->andWhere(['in', 'pese_equipamento_id', $epql])->orderby('area_preocupacao ASC, ordem ASC')->all();

                foreach ($epal as $e) {
                    $ap = [1 => 'Limites Perimetrais', 2 => 'Controle de Acessos', 3 => 'Áreas de Circulação', 4 => 'Ambientes Específicos'];

                    if (isset($ap[$e->area_preocupacao])) {
                        $a = $ap[$e->area_preocupacao];
                    } else {
                        $a = '';
                    }
                    $planoAplicacaoBasic .= '<tr><td>' . $a . '</td><td>' . $e->ambiente . '</td><td>' . $e->localizacao . '</td><td>' . $e->peseEquipamento->descricao . '</td><td>' . $e->tag . '</td></tr>';
                }

                $planoAplicacaoBasic .= '</tbody></table>';
            }
        }

        //Utils::debug($coletasReferencia);
        Yii::$app->getSession()->setFlash('success', [
            'type' => 'success',
            'duration' => 5000,
            'icon' => 'fa fa-users',
            'message' => 'My Message',
            'title' => 'My Title',
            'positonY' => 'top',
            'positonX' => 'right'
        ]);

        return $this->render('view2', [
            'model' => $model,
            'contatos' => $contatos,
            'parametros' => $parametros,
            'servicosContratados' => $servicosContratados,
            'permissoes' => $permissoes,
            'coletasReferencia' => $coletasReferencia,
            'timelines' => $timelines,
            'pareceresTecnicos' => $pareceresTecnicos,
            'recomendacoesSeguranca' => $recomendacoesSeguranca,
            'prioridades' => $prioridades,
            'anexos' => $anexos,
            'fotos' => $fotos,
            'docsExiste' => $docsExiste,
            'coletas' => $coletas,
            'cenario' => $cenario,
            'riscosCenario' => $riscosCenario,
            'consequenciasValores' => $consequenciasValores,
            'probabilidadesValores' => $probabilidadesValores,
            'riscosGrafico' => $riscosGrafico,
            'planoAplicacaoSegmentos' => $planoAplicacaoSegmentos,
            'planoAplicacaoFull' => $planoAplicacaoFull,
            'planoAplicacaoBasic' => $planoAplicacaoBasic,
            'idPeseFull' => $idPeseFull,
            'idPeseBasic' => $idPeseBasic,
        ]);
    }

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

        throw new NotFoundHttpException('Contexto não encontrado');
    }

    public function actionRealoca()
    {

        \app\models\Base::loga("Acesso a realocação do Contexto", $_GET, $_POST, 35);

        $clientes = Cliente::find()->orderBy('nome ASC')->all();

        $listaClienteOrigem = ArrayHelper::map($clientes, 'id', 'nome', 'statusLabel');

        $listaClienteDestino = [];

        foreach ($clientes as $cliente) {

            if ($cliente->status == Cliente::ATIVO) {
                $listaClienteDestino[$cliente->id] = $cliente->nome;
            }
        }

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


                $contextoOrigem = Contexto::findOne($_GET['origem']);

                $contextoDestino = Contexto::findOne($_GET['destino']);

                if ($contextoOrigem && $contextoDestino) {

                    $contextoOrigem->insertAfter($contextoDestino);
                    //$contextoOrigem->appendTo($contextoDestino);

                    $contextoOrigem->cliente_id = $contextoDestino->cliente_id;

                    $contextoOrigem->save();
                }
            }
        }

        $origem = new Contexto();

        $destino = new Contexto();

        return $this->render('realoca', [
            'listaClienteOrigem' => $listaClienteOrigem,
            'listaClienteDestino' => $listaClienteDestino,
            'origem' => $origem,
            'destino' => $destino,
        ]);
    }

    /*
     * CEON
     */

    public function actionViewOld($id, $aplicacao_id)
    {

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

        Url::remember();

        if ($aplicacao_id == \app\models\BaseModel::COVID_19_PROTOCOLO_SEGURANCA_APLICACAO_ID) {
            $this->layout = "covid19-protocolo-seguranca";
        }
        //implementar permissões

        $model = Contexto::find()
            ->where([
                'id' => $id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

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

        if (!in_array($model->id, $meusContextos)) {
            //    throw new HttpException(500, "Erro! Contexto não permitido para seu usuário");
        }


        $aplicacao = Aplicacao::find()
            ->where([
                'id' => $aplicacao_id,
                'status' => Aplicacao::ATIVO,
            ])
            ->one();

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

        $projetos = AplicacaoTemProjeto::find()
            ->select('projeto_id')
            ->where(['aplicacao_id' => $aplicacao->id])
            ->column();

        $coletas = Coleta::find()
            ->where([
                'contexto_id' => $model->id,
                'status' => Coleta::ATIVO,
            ])
            ->andWhere(['in', 'projeto_id', $projetos])
            ->andWhere(['is not', 'data_coleta', new \yii\db\Expression('null')])
            ->orderBy('data_coleta DESC, id DESC')
            ->all();

        $dadosContexto = Contexto::dadosAvaliacaoDesempenho($model, $aplicacao, $coletas, 0, 100);
        //$dadosContexto = Contexto::dadosAvaliacaoDesempenho($model, $aplicacao, $coletas);


        $coletasIds = [];
        foreach ($coletas as $coleta) {
            $coletasIds[] = $coleta->id;
        }

        $fotos = Foto::find()
            ->joinWith('coleta')
            ->where([
                'foto.status' => Foto::ATIVO,
                'coleta.status' => Coleta::ATIVO,
            ])
            ->andwhere(['in', 'coleta.id', $coletasIds])
            ->all();

        $timelines = Timeline::find()
            ->where([
                'tipo' => Timeline::TIPO_CONTEXTO,
                'vinculo' => $model->id,
                'status' => Timeline::ATIVO,
            ])
            ->orderBy('data_cadastro DESC')
            ->all();

        // utils::debug($timelines);

        $pareceresTecnicos = ParecerTecnicoColeta::find()
            ->joinWith('coleta')
            ->joinWith(['createdBy', 'updatedBy update'])
            ->where([
                'coleta.contexto_id' => $model->id,
                'parecer_tecnico_coleta.status' => ParecerTecnicoColeta::ATIVO
            ])
            ->andWhere(['>', 'parecer_tecnico_coleta.created_at', '2019-08-15 08:00:00'])
            ->orderBy('id DESC')
            ->asArray()
            ->all();

        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $model->id,
                'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
            ])
            ->orderBy('prioridade ASC, id DESC')
            ->all();

        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

        $anexos = Anexo::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $model->id,
                'anexo.status' => Anexo::ATIVO
            ])
            ->orderBy('id ASC')
            ->asArray()
            ->all();

        $contatos = '';
        foreach ($model->contextoTemContatos as $contextoContato) {
            if ($contextoContato->status == ContextoTemContato::ATIVO) {
                $contatos .= $contextoContato->contato . "<br />";
            }
        }

        $parametros = ContextoTemParametro::find()
            ->where(['contexto_id' => $model->id, 'status' => ContextoTemParametro::ATIVO,])
            ->all();

        $parametrosLabel = [];
        foreach ($parametros as $parametro) {
            if ($parametro->tipo == ContextoTemParametro::LABEL) {
                $parametrosLabel[$parametro->parametro] = $parametro->informacao;
            }
        }

        $docsExiste = [];

        foreach ($model->cliente->clienteTemDocs as $clienteTemDoc) {
            if ($clienteTemDoc->status == ClienteTemDocs::ATIVO) {
                $docsExiste[] = $clienteTemDoc->doc;
            }
        }

        $pesePlanoAplicacaoFullModel = PesePlanoAplicacao::find()
            ->where([
                'contexto_id' => $model->id,
                'tipo' => PesePlanoAplicacao::FULL,
                'status' => PesePlanoAplicacao::ATIVO,
            ])
            ->one();

        $pesePlanoAplicacaoFull = PesePlanoAplicacao::full($pesePlanoAplicacaoFullModel);

        $pesePlanoAplicacaoBasicModel = PesePlanoAplicacao::find()
            ->where([
                'contexto_id' => $model->id,
                'tipo' => PesePlanoAplicacao::BASIC,
                'status' => PesePlanoAplicacao::ATIVO,
            ])
            ->one();

        $pesePlanoAplicacaoBasic = PesePlanoAplicacao::basic($pesePlanoAplicacaoBasicModel);

        $pesePlanoAplicacaoDashboard = PesePlanoAplicacao::dashboard($pesePlanoAplicacaoFullModel, $pesePlanoAplicacaoBasicModel);

        $planoAplicacaoSegmentos = \yii\helpers\ArrayHelper::map(
            PeseSegmento::find()
                ->where(['status' => PeseSegmento::ATIVO])
                ->orderBy('descricao ASC')->all(),
            'id',
            'descricao'
        );

        $servicosContratados = ContextoTemServico::find()
            ->select('servico')
            ->where([
                'contexto_id' => $model->id,
                'status' => ContextoTemServico::ATIVO,
            ])
            ->column();

        $primeiraColetaId = null;
        $primeiraColetaVerticalId = null;
        if ($coletas) {
            $primeiraColetaId = $coletas[0]['id'];
            $primeiraColetaVerticalId = $coletas[0]['vertical_id'];
        }

        //        $riscoCenario = RiscoCenario::find()
        //                ->where(['status' => RiscoCenario::ATIVO])
        //                ->andWhere(['in', 'coleta_vinculo', $coletasIds])
        //                ->orderBy('id DESC')
        //                ->one();

        $riscoCenario = null;
        $riscos = null;
        $avisaPendencia = false;
        $botoes = false;
        $origem = null;

        if ($riscoCenario) {
            $riscos = $riscoCenario->getRiscos()->andWhere(['=', 'status', RiscoCenario::ATIVO])->all();
        }

        $grupos = ArrayHelper::map(VerticalGrupo::find()
            ->where([
                'vertical_id' => $primeiraColetaVerticalId,
                'status' => VerticalGrupo::ATIVO,
            ])
            ->orderBy('nome ASC')
            ->all(), 'id', 'nome');

        $cliente = $model->cliente;


        $isCeon = Logged::isCeon();

        if ($id == Contexto::ID_SEA) {

            $contexto = $model;

            $valorGlobal = 0;

            $responsaveis = [];

            if ($primeiraColetaId) {

                $valorGlobal = $dadosContexto['coletas'][$primeiraColetaId]['pontuacao'];


                $estruturaColeta = \app\modules\performance\models\ColetaEstrutura::find()
                    ->select('id')
                    ->where([
                        'coleta_id' => $primeiraColetaId,
                        'status' => \app\modules\performance\models\ColetaEstrutura::ATIVO
                    ])
                    ->column();

                $indicadoresColeta = \app\modules\performance\models\ColetaIndicador::find()
                    ->select('vertical_indicador_id')
                    ->where(['status' => \app\modules\performance\models\ColetaIndicador::ATIVO])
                    ->andWhere(['in', 'estrutura_id', $estruturaColeta])
                    ->orderBy('ordem_estruturada ASC')
                    ->column();

                $indicadoresColetaAll = \app\modules\performance\models\ColetaIndicador::find()
                    ->where(['status' => \app\modules\performance\models\ColetaIndicador::ATIVO])
                    ->andWhere(['in', 'estrutura_id', $estruturaColeta])
                    ->orderby('ordem_estruturada ASC')
                    ->all();


                $dadosResponsaveis = \app\modules\performance\models\VerticalIndicadorTemParametro::find()
                    ->where([
                        'status' => \app\modules\performance\models\VerticalIndicadorTemParametro::ATIVO,
                        'parametro' => 'Responsável',
                    ])
                    ->andWhere(['in', 'vertical_indicador_id', $indicadoresColeta])
                    ->orderBy('valor')
                    ->all();

                $dadosVerticalIndicadorResponsavel = [];

                foreach ($dadosResponsaveis as $dadoResponsavel) {
                    $responsaveis[str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor))] = $dadoResponsavel->valor;

                    $dadosVerticalIndicadorResponsavel[$dadoResponsavel->vertical_indicador_id] = str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor));
                }

                $indicadorResponsavelOrdem = [];

                foreach ($indicadoresColetaAll as $indicadorColetaAll) {

                    if (isset($dadosVerticalIndicadorResponsavel[$indicadorColetaAll->vertical_indicador_id])) {
                        $indicadorResponsavelOrdem[] = $dadosVerticalIndicadorResponsavel[$indicadorColetaAll->vertical_indicador_id];
                    } else {
                        $indicadorResponsavelOrdem[] = '';
                    }
                }
            }

            $corSemaforo = 'gray';

            if (isset($dadosContexto['ordem'][0]) && isset($dadosContexto['ordem'][1])) {

                $ordem0 = $dadosContexto['ordem'][0];
                $ordem1 = $dadosContexto['ordem'][1];

                if ($dadosContexto['coletas'][$ordem0]['pontuacao'] > $dadosContexto['coletas'][$ordem1]['pontuacao']) {
                    $corSemaforo = '#55BF3B';
                } elseif ($dadosContexto['coletas'][$ordem0]['pontuacao'] > $dadosContexto['coletas'][$ordem1]['pontuacao']) {
                    $corSemaforo = '#DDDF0D';
                } else {
                    $corSemaforo = '#DF5353';
                }
            }

            $dadosGpp = [];

            $gppCausaProvaveis = GppCausaProvavel::find()->all();

            foreach ($gppCausaProvaveis as $gppCausaProvavel) {

                $acoes = [];

                $acoesPropostas = GppAcaoProposta::find()
                    ->where([
                        'indicador_id' => $gppCausaProvavel->vertical_indicador_id,
                        'causa_provavel_id' => $gppCausaProvavel->id,
                    ])
                    ->all();
                foreach ($acoesPropostas as $acoesProposta) {
                    $acoes[] = [
                        'id' => $acoesProposta->id,
                        'acao_proposta' => $acoesProposta->acao_proposta,
                        'inativo' => $acoesProposta->inativo,
                        'inicio' => $acoesProposta->inicio,
                        'termino_previsto' => $acoesProposta->termino_previsto,
                        'termino_realizado' => $acoesProposta->termino_realizado,
                        'situacao' => $acoesProposta->situacao,
                    ];
                }

                $dadosGpp[$gppCausaProvavel->vertical_indicador_id][] = [
                    'causa_provavel' => $gppCausaProvavel->causa_provavel,
                    'acoes' => $acoes,
                ];
            }

            /*
              $gpps = GppTemp::find()
              ->orderBy('vertical_indicador_id ASC, id ASC')
              ->all();
              //->orderBy('vertical_indicador_id ASC, causa_provavel ASC, acao_proposta ASC, inicio ASC, id ASC')

              $situacaoGpps = [];
              foreach ($gpps as $gpp) {

              $situacaoGpps[$gpp->acao_proposta][] = preg_replace("/\r|\n/", "", trim($gpp->situacao));
              }

              $dadosGpp = [];
              $indicadoresGPP = [];
              $gppIndicador = null;

              foreach ($gpps as $gpp) {
              if ($gppIndicador != $gpp->vertical_indicador_id) {
              $indicadoresGPP[] = $gpp->vertical_indicador_id;
              $gppIndicador = $gpp->vertical_indicador_id;
              }
              }

              $tarefasGpp = [];
              $gppTarefa = null;
              $inativo = 0;
              $inicio = date('Y-m-d');
              $terminoPrevisto = '1970-01-01';
              $terminoRealizado = '1970-01-01';
              $situacao = null;
              $totalGpp = 0;

              foreach ($gpps as $gpp) {

              if (preg_replace("/\r|\n/", "", trim($gppTarefa)) != preg_replace("/\r|\n/", "", trim($gpp->acao_proposta))) {

              $totalGpp = 0;
              $inativo = 0;
              $inicio = date('Y-m-d');
              $terminoPrevisto = '1970-01-01';
              $terminoRealizado = '1970-01-01';
              }

              $totalGpp++;
              if (trim($gpp->inativo) == "Sim") {
              $inativo++;
              }

              if (strtotime($gpp->inicio) < strtotime($inicio)) {
              $inicio = $gpp->inicio;
              }

              if (strtotime($gpp->termino_previsto) > strtotime($terminoPrevisto)) {
              $terminoPrevisto = $gpp->termino_previsto;
              }

              if (strtotime($gpp->termino_realizado) > strtotime($terminoRealizado)) {
              $terminoRealizado = $gpp->termino_realizado;
              }

              $tarefasGpp[preg_replace("/\r|\n/", "", trim($gpp->acao_proposta))] = [
              'id' => $gpp->id,
              'acao_proposta' => $gpp->acao_proposta,
              'inativo' => $totalGpp == $inativo ? 'Sim' : 'Não',
              'inicio' => $inicio,
              'termino_previsto' => $terminoPrevisto != '1970-01-01' ? $terminoPrevisto : null,
              'termino_realizado' => $terminoRealizado != '1970-01-01' ? $terminoRealizado : null,
              //  'situacao' => $situacao,
              ];
              $gppTarefa = preg_replace("/\r|\n/", "", trim($gpp->acao_proposta));
              }

              $acoesGpp = [];
              $gppAcaoProposta = null;

              foreach ($gpps as $gpp) {
              if (preg_replace("/\r|\n/", "", trim($gppAcaoProposta)) != preg_replace("/\r|\n/", "", trim($gpp->acao_proposta))) {

              $situacao = '';
              if (isset($situacaoGpps[preg_replace("/\r|\n/", "", trim($gpp->acao_proposta))])) {
              $totalSituacao = count($situacaoGpps[preg_replace("/\r|\n/", "", trim($gpp->acao_proposta))]);

              $totalVazio = 0;
              $totalIniciar = 0;
              $totalAndamento = 0;
              $totalConcluido = 0;

              foreach ($situacaoGpps[preg_replace("/\r|\n/", "", trim($gpp->acao_proposta))] as $situacaoTarefa) {

              switch ($situacaoTarefa) {
              case '': $totalVazio++;
              break;
              case 'A iniciar': $totalIniciar++;
              break;
              case 'Andamento': $totalAndamento++;
              break;
              case 'Concluído': $totalAndamento++;
              break;
              }
              }

              if ($totalVazio == $totalSituacao) {
              $situacao = '';
              } elseif ($totalIniciar == $totalSituacao) {
              $situacao = 'A iniciar';
              } elseif ($totalAndamento == $totalSituacao) {
              $situacao = 'Andamento';
              } elseif ($totalConcluido == $totalSituacao) {
              $situacao = 'Concluído';
              } elseif ($totalAndamento == 0 && $totalIniciar > 0) {
              $situacao = 'A iniciar';
              } else {
              $situacao = '';
              }
              }

              $acoesGpp[preg_replace("/\r|\n/", "", trim($gpp->causa_provavel))][] = [
              'id' => $gpp->id,
              'acao_proposta' => $gpp->acao_proposta,
              'inativo' => $gpp->inativo,
              'inicio' => $gpp->inicio ? date('d/m/Y', strtotime($gpp->inicio)) : '',
              'termino_previsto' => $gpp->termino_previsto ? date('d/m/Y', strtotime($gpp->termino_previsto)) : '',
              'termino_realizado' => $gpp->termino_realizado ? date('d/m/Y', strtotime($gpp->termino_realizado)) : '',
              'situacao' => $situacao,
              ];
              }
              $gppAcaoProposta = preg_replace("/\r|\n/", "", trim($gpp->acao_proposta));
              }

              $causaProvavelGPP = [];
              $gppCausaProvavel = null;

              foreach ($gpps as $gpp) {

              if ($gppCausaProvavel != trim($gpp->causa_provavel)) {

              $acoes = [];
              if (isset($acoesGpp[trim($gpp->causa_provavel)])) {
              $acoes = $acoesGpp[trim($gpp->causa_provavel)];
              }

              $causaProvavelGPP[$gpp->vertical_indicador_id][] = [
              'causa_provavel' => $gpp->causa_provavel,
              'acoes' => $acoes,
              ];
              $gppCausaProvavel = trim($gpp->causa_provavel);
              }
              }

              foreach ($indicadoresGPP as $indicadorGPP) {

              if (isset($causaProvavelGPP[$indicadorGPP])) {
              $dadosGpp[$indicadorGPP] = $causaProvavelGPP[$indicadorGPP];
              }
              }
             */
            /*
              $dadosGpp = [];


              $gppTarefas = GppTarefa::find()->all();

              $tarefas = [];

              foreach ($gppTarefas as $gppTarefa) {

              if (!isset($tarefas[$gppTarefa->indicador_id . '||' . $gppTarefa->causa_provavel . '||' . $gppTarefa->acao_proposta])) {
              $tarefas[$gppTarefa->indicador_id . '||' . $gppTarefa->causa_provavel . '||' . $gppTarefa->acao_proposta] = [];
              }
              //if (!in_array($gppTarefa->causa_provavel . '||' . $gppTarefa->tarefa, $tarefas[$gppTarefa->causa_provavel . '||' . $gppTarefa->acao_proposta])) {
              $tarefas[$gppTarefa->indicador_id . '||' . $gppTarefa->causa_provavel . '||' . $gppTarefa->acao_proposta][] = [
              'id' => $gppTarefa->id,
              'acao_proposta' => $gppTarefa->acao_proposta,
              'inativo' => $gppTarefa->inativo,
              'inicio' => $gppTarefa->inicio,
              'termino_previsto' => $gppTarefa->termino_previsto,
              'termino_realizado' => $gppTarefa->termino_realizado,
              'situacao' => $gppTarefa->situacao ?? '',
              ];
              // }
              }

              $gppAcoesPropostas = GppAcaoProposta::find()->all();

              $acoes = [];
              $tarefasC = [];
              foreach ($gppAcoesPropostas as $gppAcoesProposta) {

              if (!isset($acoes[$gppAcoesProposta->indicador_id . '||' . $gppAcoesProposta->causa_provavel])) {
              $acoes[$gppAcoesProposta->indicador_id . '||' . $gppAcoesProposta->causa_provavel] = [];
              }
              //if (!in_array($gppAcoesProposta->indicador_id . '||' . $gppAcoesProposta->acao_proposta, $acoes[$gppAcoesProposta->indicador_id . '||' . $gppAcoesProposta->causa_provavel])) {
              //if (isset($tarefas[$gppAcoesProposta->indicador_id . '||' . $gppAcoesProposta->causa_provavel . '||' . $gppAcoesProposta->acao_proposta])) {
              $tarefasC = $tarefas[$gppAcoesProposta->indicador_id . '||' . $gppAcoesProposta->causa_provavel . '||' . $gppAcoesProposta->acao_proposta];
              //}

              $tarefasD = $tarefasC;
              if (count($tarefasC) > 1) {
              $tarefasD = [];
              $inativo = 'Não';
              $inicio = date('Y-m-d');
              $terminoPrevisto = '1970-01-01';
              $terminoRealizado = '1970-01-01';
              $situacao = 'Concluído';

              // Utils::debug([count($tarefasC),$tarefasC]);
              foreach ($tarefasC as $key => $tarefaC) {
              if ($tarefaC['inativo'] == "Sim") {
              $inativo = 'Sim';
              }

              if (strtotime($tarefaC['inicio']) < strtotime($inicio)) {
              $inicio = $tarefaC['inicio'];
              }

              if (strtotime($tarefaC['termino_previsto']) > strtotime($terminoPrevisto)) {
              $terminoPrevisto = $tarefaC['termino_previsto'];
              }

              if (strtotime($tarefaC['termino_realizado']) > strtotime($terminoRealizado)) {
              $terminoRealizado = $tarefaC['termino_realizado'];
              }

              if ($tarefaC['situacao'] == 'Andamento' && $situacao == 'Concluído') {
              $situacao = 'Andamento';
              }
              if ($tarefaC['situacao'] == 'A iniciar' && ($situacao == 'Concluído' || $situacao == 'Andamento')) {
              $situacao = 'A iniciar';
              }
              if (!$tarefaC['situacao'] && ($situacao == 'Concluído' || $situacao == 'Andamento' || $situacao == 'A iniciar')) {
              $situacao = '';
              }
              }

              $tarefasD = [
              'id' => $tarefaC['id'],
              'acao_proposta' => $gppAcoesProposta->acao_proposta,
              'inativo' => $inativo,
              'inicio' => $inicio,
              'termino_previsto' => $terminoPrevisto,
              'termino_realizado' => $terminoRealizado,
              'situacao' => $situacao,
              ];
              }
              $acoes[$gppAcoesProposta->indicador_id . '||' . $gppAcoesProposta->causa_provavel][] = $tarefasD;
              //}
              }



              $gppCausaProvaveis = GppCausaProvavel::find()->all();

              $causas = [];

              foreach ($gppCausaProvaveis as $gppCausaProvavel) {

              if (!isset($causas[$gppCausaProvavel->vertical_indicador_id])) {
              $causas[$gppCausaProvavel->vertical_indicador_id] = [];
              }
              $causas[$gppCausaProvavel->vertical_indicador_id][] = $gppAcoesProposta->indicador_id . '||' . $gppCausaProvavel->causa_provavel;
              }

              $dadosGpp = [];
              foreach ($gppCausaProvaveis as $gppCausaProvavel) {

              $acoesCP = [];

              if (isset($acoes[$gppCausaProvavel->vertical_indicador_id . '||' . $gppCausaProvavel->causa_provavel])) {
              $acoesCP = $acoes[$gppCausaProvavel->vertical_indicador_id . '||' . $gppCausaProvavel->causa_provavel];
              }

              $dadosGpp[$gppCausaProvavel->vertical_indicador_id][] = [
              'causa_provavel' => $gppCausaProvavel->causa_provavel,
              'acoes' => $acoesCP,
              ];
              }

              //$gppCausaProvaveis = GppCausaProvavel::find()->all();
              //            foreach($gppCausaProvaveis as $gppCausaProvavel){
              //                $dadosGpp[$gppCausaProvavel->vertical_indicador_id]['causa_provavel'] = [];
              //            }
              //
              //            foreach($gppCausaProvaveis as $gppCausaProvavel){
              //
              //                if(!in_array($gppCausaProvavel->causa_provavel, $dadosGpp[$gppCausaProvavel->vertical_indicador_id]['causa_provavel'])){
              //                    $dadosGpp[$gppCausaProvavel->vertical_indicador_id]['causa_provavel'][] = $gppCausaProvavel->causa_provavel;
              //                }
              //            }
              //
              //            $gppAcoesPropostas = GppAcaoProposta::find()->all();
              //
              //            foreach($gppAcoesPropostas as $gppAcoesPropostas){
              //
              //            //    $dadosGpp[$gppCausaProvavel->vertical_indicador_id]['causa_provavel'] = [];
              //            }
             * 
             */



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

            return $this->render('sea', [
                'aplicacao' => $aplicacao,
                'primeiraColetaId' => $primeiraColetaId,
                'contexto' => $contexto,
                'model' => $contexto,
                'parametrosLabel' => $parametrosLabel,
                'dadosContexto' => $dadosContexto,
                'valorGlobal' => $valorGlobal,
                'corSemaforo' => $corSemaforo,
                'responsaveis' => $responsaveis,
                'indicadorResponsavelOrdem' => $indicadorResponsavelOrdem,
                'dadosVerticalIndicadorResponsavel' => $dadosVerticalIndicadorResponsavel,
                'contatos' => $contatos,
                'parametros' => $parametros,
                'parametrosLabel' => [],
                'recomendacoesSeguranca' => [],
                'fotos' => [],
                'riscoCenario' => null,
                'servicosContratados' => $servicosContratados,
                'pareceresTecnicos' => $pareceresTecnicos,
                'anexos' => $anexos,
                'timelines' => $timelines,
                'isCeon' => $isCeon,
                'dadosGpp' => $dadosGpp,
            ]);
        }


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

        return $this->render('view', [
            'model' => $model,
            'primeiraColetaId' => $primeiraColetaId,
            'timelines' => $timelines,
            'pareceresTecnicos' => $pareceresTecnicos,
            'recomendacoesSeguranca' => $recomendacoesSeguranca,
            'prioridades' => $prioridades,
            'anexos' => $anexos,
            'fotos' => $fotos,
            'contatos' => $contatos,
            'parametros' => $parametros,
            'docsExiste' => $docsExiste,
            'pesePlanoAplicacaoDashboard' => $pesePlanoAplicacaoDashboard,
            'pesePlanoAplicacaoFullModel' => $pesePlanoAplicacaoFullModel,
            'pesePlanoAplicacaoFull' => $pesePlanoAplicacaoFull,
            'pesePlanoAplicacaoBasicModel' => $pesePlanoAplicacaoBasicModel,
            'pesePlanoAplicacaoBasic' => $pesePlanoAplicacaoBasic,
            'planoAplicacaoSegmentos' => $planoAplicacaoSegmentos,
            'coletas' => $coletas,
            'parametrosLabel' => $parametrosLabel,
            'servicosContratados' => $servicosContratados,
            'aplicacao' => $aplicacao,
            'dadosContexto' => $dadosContexto,
            'riscoCenario' => $riscoCenario,
            'riscos' => $riscos,
            'avisaPendencia' => $avisaPendencia,
            'botoes' => $botoes,
            'origem' => $origem,
            'cliente' => $cliente,
            'isCeon' => $isCeon,
            'grupos' => $grupos,
        ]);
    }

    public function actionMulti()
    {

        if (!\app\models\TermosUso::jaAceitouTermo(\Yii::$app->user->identity->id, null)) {
            \yii\helpers\Url::remember();
            $this->redirect('/termos-uso/aceite')->send();
            exit();
        }

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

        $contextos = GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->andWhere('rgt-lft=1')
            ->andWhere(['=', 'active', Contexto::ATIVO])
            ->orderBy('name ASC')
            ->all();

        //        $recursos = \app\models\UserHasResource::find()
        //                ->select('resource_id')
        //                ->where([
        //                    'user_id' => \Yii::$app->user->identity->id ?? null,                    
        //                ])
        //                ->andWhere(['or',
        //                    ['role' => UserHasResource::NV_CP_CONTEXTO_ADM],
        //                    ['role' => UserHasResource::NV_CP_CONTEXTO_VIEW],
        //                ])
        //                ->column();
        //
        //        $contextos = Contexto::find()
        //                ->where(['active' => Contexto::ATIVO,])
        //                ->andWhere(['in', 'id', $recursos])
        //                ->all();


        if (!$contextos) {
            throw new HttpException(500, "Erro! Nenhum Contexto não encontrado, entre em contato com o suporte informando o errdo CP CSNE");
        }


        $dados = [];

        foreach ($contextos as $contexto) {

            $clientesId = [];
            $contextosId = [];
            $contextosIdString = [];

            $projetosTodosContextos = Projeto::find()
                ->select('id')
                ->where([
                    'contextos' => '*',
                    'cliente_id' => $contexto->cliente_id,
                    'status' => Projeto::ATIVO
                ])
                ->column();

            $projetosContexto = Projeto::find()
                ->select('id')
                ->where([
                    'cliente_id' => $contexto->cliente_id,
                    'status' => Projeto::ATIVO
                ])
                ->andWhere([
                    'OR',
                    ['like', 'contextos', $contexto->id],
                    ['like', 'contextos', $contexto->id . ','],
                ])
                ->column();

            $projetos = array_merge($projetosTodosContextos, $projetosContexto);

            $aplicacoes = Aplicacao::find()
                ->joinWith('aplicacaoTemProjetos')
                ->where([
                    'aplicacao.status' => Aplicacao::ATIVO,
                ])
                ->andWhere(['in', 'aplicacao_tem_projeto.projeto_id', $projetos])
                ->all();

            foreach ($aplicacoes as $aplicacao) {

                $projetosAplicacao = [];
                foreach ($aplicacao->aplicacaoTemProjetos as $aplicacaoTemProjeto) {
                    $projetosAplicacao = $aplicacaoTemProjeto->projeto_id;
                }
                $ultimaColeta = $contexto->getUltimaColetaAplicacao($projetosAplicacao);

                $dados[] = [
                    'id' => $contexto->id,
                    'aplicacao_id' => $aplicacao->id,
                    'aplicacao' => $aplicacao->nome,
                    'projeto_id' => $aplicacao->aplicacaoTemProjetos[0]->projeto_id,
                    'projeto' => $aplicacao->aplicacaoTemProjetos[0]->projeto->nome,
                    'contexto_id' => $contexto->id,
                    'contexto' => $contexto->name,
                    'ultimaColeta' => $ultimaColeta ? date('d/m/Y H:i', strtotime($ultimaColeta->data_coleta)) : 'N/D',
                    'pontuacao' => $ultimaColeta ? $ultimaColeta->valorGlobal : 'N/D',
                    'permissaoUsuario' => $contexto->usuarioPermissao,
                ];
            }
        }
        // \app\components\Utils::debug([$dados, $projetosTodosContextos, $projetosContexto, $contextos]);

        $dataProvider = new ArrayDataProvider([
            'allModels' => $dados,
            'pagination' => [
                'pageSize' => false,
            ],
        ]);

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

    public function actionNodeSave()
    {

        $post = Yii::$app->request->post();

        if ($post['Contexto']['id'] != '') {
            $model = Contexto::findOne($post['Contexto']['id']);
            $novo = false;
        } else {
            $model = new Contexto();
            $novo = true;
        }

        $model->load($post);

        if ($model->isNewRecord) {

            $model->cota_disco = Contexto::COTA_PADRAO;

            $permite = false;
            //cliente gestor
            $clientes = GenericSearch::filterMyClientes()
                ->query
                ->select('id')
                ->column();

            if (in_array($model->cliente_id, $clientes)) {
                $permite = true;
            }

            //aplicação gestor
            if (isset($_POST['projetos'])) {
                $aplicacoes = AplicacaoTemProjeto::find()
                    ->select('aplicacao_id')
                    ->andWhere(['in', 'projeto_id', $_POST['projetos']])
                    ->column();

                $myAplicacoes = GenericSearch::filterMyAplicacaos()
                    ->query
                    ->select('id')
                    ->column();

                foreach ($aplicacoes as $aplicacao) {
                    if (in_array($aplicacao, $myAplicacoes)) {
                        $permite = true;
                    }
                }
            }

            if (!$permite) {
                throw new HttpException(500, "Contexto não está associado a seus Clientes ou Aplicações");
            }
        } else {
            $contextosPermitidos = GenericSearch::filterMyContextosVisualizacao()
                ->query
                ->select('contexto.id')
                ->column();

            if (!in_array($model->id, $contextosPermitidos)) {
                throw new HttpException(500, "Contexto não permitido para seu usuário");
            }
        }





        $successMsg = 'Contexto salvo com sucesso';
        $errorMsg = 'Erro ao salvar o Contexto, motivo: ';

        if (Yii::$app->has('session')) {
            $session = Yii::$app->session;

            $session->set(ArrayHelper::getValue($post, 'nodeSelected', 'kvNodeId'), $model->id);
        }

        $model->file = UploadedFile::getInstance($model, 'file');

        if ($model->file) {

            $model->foto = md5(date('Ymd') . $model->file->name) . '.' . $model->file->extension;

            if (!$model->upload()) {
                throw new HttpException(500, "Erro ao salvar a foto de perfil, motivo: " . json_encode($model->getErrors()));
            }
        }

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

        if ($_POST['ContextoTemContato']) {
            foreach ($_POST['ContextoTemContato']['contato'] as $contato) {
                if (!empty($contato)) {
                    $novoContato = new ContextoTemContato();
                    $novoContato->contexto_id = $model->id;
                    $novoContato->contato = (string) $contato;
                    $novoContato->status = ContextoTemContato::ATIVO;
                    $novoContato->created_by = Yii::$app->user->identity->id ?? null;
                    $novoContato->created_at = date('Y-m-d H:i:s');

                    if (!$novoContato->save()) {
                        throw new \yii\web\HttpException(500, "Erro ao salvar o contato, motivo: " . json_encode($novoContato->getErrors()));
                    }
                }
            }
        }

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

        if ($_POST['ContextoTemParametro']) {
            $k = 0;
            foreach ($_POST['ContextoTemParametro']['parametro'] as $parametro) {
                //\app\component\Utils::debug($_POST['ContextoTemParametro']);
                if (!empty($parametro)) {
                    $novoParametro = new ContextoTemParametro();
                    $novoParametro->contexto_id = $model->id;
                    $novoParametro->tipo = (int) $_POST['ContextoTemParametro']['tipo'][$k];
                    $novoParametro->parametro = (string) $parametro;
                    $novoParametro->informacao = (string) $_POST['ContextoTemParametro']['informacao'][$k];
                    $novoParametro->status = ContextoTemParametro::ATIVO;
                    $novoParametro->created_by = Yii::$app->user->identity->id ?? null;
                    $novoParametro->created_at = date('Y-m-d H:i:s');

                    if (!$novoParametro->save()) {
                        throw new \yii\web\HttpException(500, "Erro ao salvar o parametro, motivo: " . json_encode($novoParametro->getErrors()));
                    }
                    $k++;
                }
            }
        }

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

        if (isset($_POST['Servicos'])) {
            if ($_POST['Servicos']) {
                foreach ($_POST['Servicos']['servico'] as $servico) {
                    //\app\component\Utils::debug($_POST['ContextoTemParametro']);
                    if (!empty($servico)) {
                        $novoServico = new ContextoTemServico();
                        $novoServico->contexto_id = $model->id;
                        $novoServico->servico = (string) $servico;
                        $novoServico->status = ContextoTemServico::ATIVO;
                        $novoServico->created_by = Yii::$app->user->identity->id ?? null;
                        $novoServico->created_at = date('Y-m-d H:i:s');

                        if (!$novoServico->save()) {
                            throw new \yii\web\HttpException(500, "Erro ao salvar o serviço, motivo: " . json_encode($novoServico->getErrors()));
                        }
                        $k++;
                    }
                }
            }
        }

        if (isset($_POST['projetosatual'])) {
            foreach ($_POST['projetosatual'] as $projetoAtual) {

                $projetoRemoverContexto = Projeto::findOne($projetoAtual);

                if ($projetoRemoverContexto) {

                    $expP = explode(",", $projetoRemoverContexto->contextos);
                    $key = array_search($model->id, $expP);
                    if ($key !== false) {
                        unset($expP[$key]);
                    }

                    $projetoRemoverContexto->contextos = implode(",", $expP);

                    if (!$projetoRemoverContexto->save()) {
                        throw new HttpException(500, "Erro ao remover o Contexto do Projeto " . $projetoAtual . ", motivo: " . json_encode($projetoRemoverContexto->getErrors()));
                    }
                }
            }
        }

        if (isset($_POST['projetos'])) {
            foreach ($_POST['projetos'] as $projetoIncluir) {

                $projetoAdicionarContexto = Projeto::findOne($projetoIncluir);

                if ($projetoAdicionarContexto) {

                    $expP = explode(",", $projetoAdicionarContexto->contextos);

                    $expP[] = $model->id;

                    $projetoAdicionarContexto->contextos = implode(",", $expP);

                    if (!$projetoAdicionarContexto->save()) {
                        throw new HttpException(500, "Erro ao remover o Contexto do Projeto " . $projetoIncluir . ", motivo: " . json_encode($projetoAdicionarContexto->getErrors()));
                    }
                }
            }
        }

        $aplicacoes = Aplicacao::find()
            ->join('left join', 'unidade_negocio', 'aplicacao.unidade_negocio_id=unidade_negocio.id')
            ->join('left join', 'cliente', 'unidade_negocio.cliente_id=cliente.id')
            ->where([
                'cliente.id' => $model->cliente_id,
                'aplicacao.status' => Aplicacao::ATIVO
            ])
            ->orderBy('aplicacao.nome ASC')
            ->all();

        foreach ($aplicacoes as $aplicacao) {
            Aplicacao::atualizaDadosAplicacao($aplicacao);
        }
        //Utils::debug($post);

        if ($post['parentKey'] == 'KRAJEE~!~ROOT~!~NODE') {
            $model->makeRoot();
        } else {
            if ($novo) {
                $destino = Contexto::findOne($post['parentKey']);
                $model->appendTo($destino);
            }
        }

        if ($model->save()) {
            $session->setFlash('success', $successMsg);
        } else {
            $session->setFlash('error', $errorMsg);
        }

        return $this->redirect(Url::previous());
    }

    public function actionPesquisaCpfFeeling($cpf, $cliente_id)
    {

        return false;

        $contextoTemParametro = ContextoTemParametro::find()
            ->where([
                'parametro' => 'CPF',
                'informacao' => $cpf,
                'status' => ContextoTemParametro::ATIVO,
            ])
            ->one();

        $usuario = User::find()
            ->where([
                'username' => \app\components\Filter::onlyNumbers($cpf),
                'status' => User::STATUS_ACTIVE,
            ])
            ->one();

        $dados = [];

        if ($contextoTemParametro && $usuario) {

            $meusContextos = \app\models\GenericSearch::filterMyContextosVisualizacao()
                ->query
                ->select('id')
                ->andWhere(['=', 'id', $contextoTemParametro->contexto_id])
                ->column();

            if (empty($meusContextos)) {
                throw new \Exception("CPF não pertence a seus pacientes", 1);
            }

            $todosParametrosContexto = ArrayHelper::map(
                ContextoTemParametro::find()
                    ->where([
                        'contexto_id' => $contextoTemParametro->contexto_id,
                        'status' => ContextoTemParametro::ATIVO,
                    ])
                    ->all(),
                'parametro',
                'informacao'
            );

            $grupoId = '';
            if (isset($todosParametrosContexto['Grupo'])) {
                $aplicacao = \app\modules\performance\models\Aplicacao::find()
                    ->joinWith('unidadeNegocio')
                    ->where([
                        'aplicacao.nome' => $todosParametrosContexto['Grupo'],
                        'unidade_negocio.cliente_id' => $cliente_id,
                    ])
                    ->one();

                if ($aplicacao) {
                    $grupoId = $aplicacao->id;
                }
            }


            $dados = [
                'nome' => $contextoTemParametro->contexto->name,
                'email' => $usuario->email,
                'grupo' => $grupoId,
                'telefone' => isset($todosParametrosContexto['Telefone']) ? $todosParametrosContexto['Telefone'] : '',
                'endereco' => isset($todosParametrosContexto['Endereço']) ? $todosParametrosContexto['Endereço'] : '',
                'municipio' => isset($todosParametrosContexto['Município']) ? $todosParametrosContexto['Município'] : '',
                'sexo' => isset($todosParametrosContexto['Sexo']) ? $todosParametrosContexto['Sexo'] : '',
                'idade' => isset($todosParametrosContexto['Idade']) ? $todosParametrosContexto['Idade'] : '',
                'altura' => isset($todosParametrosContexto['Altura']) ? $todosParametrosContexto['Altura'] : '',
                'senha' => 'Já enviado',
            ];
        }

        return json_encode($dados);
    }

    /* antigo view3 */

    public function actionView($id, $aplicacao_id = 7, $selectcoleta0 = null, $selectcoleta1 = null, $coletaplanoacao = null, $vertical_indicador_id = null, $ocorrencia_id = null, $output = 'view')
    {
        \app\models\Base::loga("Acessou a visualização de Contexto", $_GET, $_POST, 49, $id);
        Url::remember(['/performance/contexto/view', 'id' => $id, 'aplicacao_id' => $aplicacao_id], 'lgpdv2');

        if (!\app\models\TermosUso::jaAceitouTermo(\Yii::$app->user->identity->id, null)) {
            \yii\helpers\Url::remember();
            $this->redirect('/termos-uso/aceite')->send();
            exit();
        }

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

        Url::remember();

        $contexto = Contexto::find()
            ->where([
                'id' => $id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

        if (!$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");
        }

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

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


        $aplicacao = Aplicacao::find()
            ->where([
                'id' => $aplicacao_id,
                'status' => Aplicacao::ATIVO,
            ])
            ->one();

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

        $projetos = AplicacaoTemProjeto::find()
            ->select('projeto_id')
            ->where(['aplicacao_id' => $aplicacao->id])
            ->column();

        $coletas = Coleta::find()
            ->where([
                'contexto_id' => $contexto->id,
                'status' => Coleta::ATIVO,
            ])
            //   ->andWhere(['in', 'projeto_id', $projetos])
            ->andWhere(['is not', 'data_coleta', new \yii\db\Expression('null')])
            ->orderBy('id ASC')
            ->all();

        $coletasIds = [];
        $totalColetas = 0;
        $valorGlobal = 0;
        $coletaValores = [];
        $coletaNomes = [];
        $coletasIdNome = [];
        $percentual = 0;
        $evolucao = '';
        $totalIndicadores = 0;
        $totalIndicadoresDemandamAtencao = 0;
        $coletaApoioValorGlobal = 0;
        $coletaReferenciaIndicadores = null;
        $percentualIndicadorComprometedor = 0;
        $percentualIndicadorMercado = 0;
        $percentualIndicadorExcelencia = 0;
        $verticeColetaReferencia = null;
        $listaColetaArray = [];

        foreach ($coletas as $coletaX) {
            $listaColetaArray[$coletaX->id] = $coletaX->nome;
        }

        $coletaReferencia = null; //dados exibidos
        $coletaApoio = null; //dados comparativos

        $listaValoresGlobais = [];
        foreach ($coletas as $coleta) {
            $cvG = $coleta->valorGlobal;
            $listaValoresGlobais[$coleta->id] = $cvG;
            $coletaValores[] = $cvG;
            $coletaNomes[] = $coleta->nome;
        }

        if ($selectcoleta0 && $selectcoleta1) {

            foreach ($coletas as $coleta) {

                if ($coleta->id == $selectcoleta1) {
                    $coletaReferencia = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta1])) {
                        $valorGlobal = $listaValoresGlobais[$selectcoleta1];
                    }
                }
            }
            foreach ($coletas as $coleta) {
                if ($coleta->id == $selectcoleta0) {
                    $coletaApoio = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta0])) {
                        $coletaApoioValorGlobal = $listaValoresGlobais[$selectcoleta0];
                    }
                }
            }
        } elseif ($selectcoleta0 && !$selectcoleta1) {

            foreach ($coletas as $coleta) {

                if ($coleta->id == $selectcoleta0) {
                    $coletaReferencia = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta0])) {
                        $valorGlobal = $listaValoresGlobais[$selectcoleta0];
                    }
                    break;
                }
            }
        } else {
            foreach ($coletas as $coleta) {
                $coletaReferencia = $coleta;
                if (isset($listaValoresGlobais[$coleta->id])) {
                    $valorGlobal = $listaValoresGlobais[$coleta->id];
                }
                $coletasIdNome[$coleta->id] = $coleta->nome;
                $coletasIds[] = $coleta->id;
            }
        }

        foreach ($coletas as $coleta) {
            $totalColetas++;
            $coletasIdNome[$coleta->id] = $coleta->nome;
            $coletasIds[] = $coleta->id;
            if (!$coletaReferencia) {
                $coletaReferencia = $coleta;
            }
        }

        /*
         * Verificando se os select pertencem
         */
        if ($selectcoleta0 && !in_array($selectcoleta0, $coletasIds)) {
            throw new HttpException(500, "Coleta selecionada não pertence ao Contexto");
        }
        if ($selectcoleta1 && !in_array($selectcoleta1, $coletasIds)) {
            throw new HttpException(500, "Coleta comparada não pertence ao Contexto");
        }

        $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        $percentual = 0;


        if ($selectcoleta0 && $selectcoleta1) {

            if (
                is_numeric($selectcoleta0) &&
                $selectcoleta0 != 0 &&
                is_numeric($selectcoleta1) &&
                isset($listaValoresGlobais[$selectcoleta0]) &&
                isset($listaValoresGlobais[$selectcoleta1])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta1] / (int) $listaValoresGlobais[$selectcoleta0]) - 1) * 100, 2);
            }
        } elseif ($selectcoleta1) {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($selectcoleta1) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                isset($listaValoresGlobais[$selectcoleta1])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta1] / (int) $listaValoresGlobais[$primeiraCol]) - 1) * 100, 2);
            }
        } elseif ($selectcoleta0) {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($selectcoleta0) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                $listaValoresGlobais[$primeiraCol] != 0 &&
                isset($listaValoresGlobais[$selectcoleta0])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta0] / (int) $listaValoresGlobais[$primeiraCol]) - 1) * 100, 2);
            }
        } else {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;
            $ultimaCol = end($listaTemp);

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($ultimaCol) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                // $listaValoresGlobais[$primeiraCol] != 0 &&
                isset($listaValoresGlobais[$ultimaCol])
            ) {

                $pontuacao1 = $listaValoresGlobais[$primeiraCol];
                if ($pontuacao1 == 0) {
                    $pontuacao1 = 1;
                }
                $percentual = round((((int) $listaValoresGlobais[$ultimaCol] / (int) $pontuacao1) - 1) * 100, 2);
            }
        }


        //        if (isset($coletaValores[0])) {
        //            if (is_numeric($coletaValores[0]) && $coletaValores[0] != 0 && is_numeric(end($coletaValores)) && end($coletaValores) != 0) {
        //                $percentual = round((((int) end($coletaValores) / (int) $coletaValores[0]) - 1) * 100, 2);

        $icone = '<i class="fas fa-arrow-circle-up" style="color:#089F50"></i>';

        if ($percentual == 0) {

            $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        }
        if ($percentual < 0) {
            $icone = '<i class="fas fa-arrow-circle-down" style="color:#DF5353"></i>';
        }

        $evolucao = str_replace(".", ",", floatval($percentual)) . '% ' . $icone;
        //        }
        //    }
        //        if (isset($coletaValores[0])) {
        //            if (is_numeric($coletaValores[0]) && $coletaValores[0] != 0 && is_numeric(end($coletaValores)) && end($coletaValores) != 0) {
        //                $percentual = round((((int) end($coletaValores) / (int) $coletaValores[0]) - 1) * 100, 2);
        //
        //                $icone = '<i class="fas fa-arrow-circle-up" style="color:#089F50"></i>';
        //
        //                if ($percentual == 0) {
        //
        //                    $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        //                }
        //                if ($percentual < 0) {
        //                    $icone = '<i class="fas fa-arrow-circle-down" style="color:#DF5353"></i>';
        //                }
        //
        //                $evolucao = str_replace(".", ",", floatval($percentual)) . '% ' . $icone;
        //            }
        //        }

        $minimoComprometedor = 20;
        $minimoExcelencia = 80;

        $totalIndicadores = 0;
        $totalIndicadoresDemandamAtencao = 0;

        $listaNomeIndicadores = [];
        $listaValoresIndicadores = [];
        $indiceIndicador = 0;

        /*
         * 
         */
        $coletaReferenciaIndicacores = null;
        $coletaReferenciaIndicacoresExcelencia = 0;
        $coletaReferenciaIndicacoresMercado = 0;
        $coletaReferenciaIndicacoresComprometedor = 0;
        $coletaReferenciaListaIndicacoresExcelencia = [];
        $coletaReferenciaListaIndicacoresMercado = [];
        $coletaReferenciaListaIndicacoresComprometedor = [];

        //$gppCausaProvaveis = ArrayHelper::map(GppCausaProvavel::find()->all(), 'id', 'vertical_indicador_id');
        $gppCausaProvaveis = [];
        //        $paPlanoAcaos = ArrayHelper::map(
        //                        PlanoAcao::find()
        //                                ->where([
        //                                    'contexto_id' => $contexto->id ?? null,
        //                                    'status' => PlanoAcao::ATIVO,
        //                                ])
        //                                ->all(), 'id', 'vertical_indicador_id');

        $paPlanosAcaoTemVertical = \app\modules\performance\models\PlanoAcaoTemIndicador::find()
            ->joinWith('paPlanoAcao')
            ->select('pa_plano_acao_tem_indicador.vertical_indicador_id')
            ->where([
                'contexto_id' => $contexto->id ?? null,
                'status' => PlanoAcao::ATIVO,
            ])
            ->column();
        //Utils::debug($paPlanosAcaoTemVertical);

        $pareceresTecnicos = ParecerTecnicoColeta::find()
            ->joinWith('coleta')
            ->joinWith(['createdBy', 'updatedBy update'])
            ->where([
                'coleta.contexto_id' => $contexto->id,
                'parecer_tecnico_coleta.status' => ParecerTecnicoColeta::ATIVO
            ])
            ->andWhere(['>', 'parecer_tecnico_coleta.created_at', '2019-08-15 08:00:00'])
            ->orderBy('id DESC')
            ->asArray()
            ->all();

        $pareceresTecnicosVerticalIndicador = [];
        foreach ($pareceresTecnicos as $pareceresTecnico) {
            if ($pareceresTecnico['vertical_indicador_id']) {
                $pareceresTecnicosVerticalIndicador[$pareceresTecnico['vertical_indicador_id']][] = $pareceresTecnico;
            }
        }

        $pareceresTecnicos = array_reverse($pareceresTecnicos, true);


        if ($coletaReferencia) {

            $indicadorSparkline = [];

            $coletaIndicadoresSparkline = ColetaIndicador::find()
                ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id=coleta_indicador.estrutura_id')
                ->join('LEFT JOIN', 'coleta', 'coleta.id=coleta_estrutura.coleta_id')
                ->where([
                    'coleta.projeto_id' => $coletaReferencia->projeto_id,
                    'coleta.vertical_id' => $coletaReferencia->vertical_id,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta.contexto_id' => $contexto->id ?? null,
                    'coleta.status' => Coleta::ATIVO,
                ])
                ->orderBy('coleta.data_coleta ASC, coleta.id ASC')
                ->all();

            foreach ($coletaIndicadoresSparkline as $coletaIndicadorSparkline) {
                if ($coletaIndicadorSparkline->vertical_indicador_id) {
                    $indicadorSparkline[$coletaIndicadorSparkline->vertical_indicador_id][] = $coletaIndicadorSparkline->pontuacao;
                }
            }

            $coletaReferenciaIndicadores = ColetaIndicador::find()
                ->select([
                    'coleta_indicador.id as id',
                    'coleta_indicador.nome as nome',
                    'coleta_indicador.pontuacao as pontuacao',
                    'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                    'coleta_indicador.conceito as conceito',
                    'coleta_indicador.estrutura_id as estrutura_id',
                    'vertical_indicador.usa_interpolacao as usainterpolacao',
                ])
                ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                ->where([
                    'coleta_estrutura.coleta_id' => $coletaReferencia->id,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO
                ])
                ->asArray()
                ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                ->all();
            foreach ($coletaReferenciaIndicadores as $coletaReferenciaIndicador) {

                $listaNomeIndicadores[] = $coletaReferenciaIndicador['nome'];

                $listaValoresIndicadores[] = ['y' => (int) $coletaReferenciaIndicador['pontuacao']];

                $minimoTemp = 0;
                $maximoTemp = 0;
                foreach ($coletaReferenciaIndicador['coletaAlternativas'] as $coletaAlternativaExcelencia) {
                    if ($coletaAlternativaExcelencia['nivel_referencia'] < $minimoTemp) {
                        $minimoTemp = $coletaAlternativaExcelencia['nivel_referencia'];
                    }
                    if ($coletaAlternativaExcelencia['nivel_referencia'] > $maximoTemp) {
                        $maximoTemp = $coletaAlternativaExcelencia['nivel_referencia'];
                    }
                }
                $coletaReferenciaIndicador['minimo'] = $minimoTemp;
                $coletaReferenciaIndicador['maximo'] = $maximoTemp;
                $coletaReferenciaIndicador['ordem'] = $indiceIndicador;
                $coletaReferenciaIndicador['vertical_indicador_id'] = $coletaReferenciaIndicador['vertical_indicador_id'];
                $coletaReferenciaIndicador['usainterpolacao'] = $coletaReferenciaIndicador['usainterpolacao'];

                $coletaReferenciaIndicador['sparkline'] = '';
                if (isset($indicadorSparkline[$coletaReferenciaIndicador['vertical_indicador_id']])) {
                    $coletaReferenciaIndicador['sparkline'] = implode(",", $indicadorSparkline[$coletaReferenciaIndicador['vertical_indicador_id']]);
                }

                //                if (in_array($coletaReferenciaIndicador['vertical_indicador_id'], $gppCausaProvaveis)) {
                //                    $coletaReferenciaIndicador['planoaplicacao'] = '<i class="fab fa-product-hunt" title="Possui Plano de Ação"></i>';
                //                } else
                if (in_array($coletaReferenciaIndicador['vertical_indicador_id'], $paPlanosAcaoTemVertical)) {
                    $coletaReferenciaIndicador['planoaplicacao'] = '<i class="fab fa-product-hunt" title="Possui Plano de Ação"></i>';
                } else {
                    $coletaReferenciaIndicador['planoaplicacao'] = '';
                }

                if ($coletaReferenciaIndicador['pontuacao'] >= $minimoExcelencia) {

                    $coletaReferenciaListaIndicacoresExcelencia[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresExcelencia++;
                } elseif ($coletaReferenciaIndicador['pontuacao'] <= $minimoComprometedor) {

                    $coletaReferenciaListaIndicacoresComprometedor[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresComprometedor++;
                    $totalIndicadoresDemandamAtencao++;
                } else {

                    $coletaReferenciaListaIndicacoresMercado[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresMercado++;
                }

                if (isset($pareceresTecnicosVerticalIndicador[$coletaReferenciaIndicador['vertical_indicador_id']])) {
                    $coletaReferenciaIndicadores[$indiceIndicador]['parecer_indicador'] = 'sim';
                }

                $indiceIndicador++;
            }

            $totalIndicadores = count($coletaReferenciaIndicadores);


            $percentualIndicadorComprometedor = 0;
            $percentualIndicadorMercado = 0;
            $percentualIndicadorExcelencia = 0;
            if ($totalIndicadores > 0) {
                $percentualIndicadorComprometedor = ($coletaReferenciaIndicacoresComprometedor / $totalIndicadores) * 100;
                $percentualIndicadorComprometedor = round($percentualIndicadorComprometedor, 2);

                $percentualIndicadorMercado = ($coletaReferenciaIndicacoresMercado / $totalIndicadores) * 100;
                $percentualIndicadorMercado = round($percentualIndicadorMercado, 2);

                $percentualIndicadorExcelencia = 100 - ($percentualIndicadorMercado + $percentualIndicadorComprometedor);
                $percentualIndicadorExcelencia = round($percentualIndicadorExcelencia, 2);

                $percentualIndicadorComprometedor = str_replace(".", ",", $percentualIndicadorComprometedor);
                $percentualIndicadorMercado = str_replace(".", ",", $percentualIndicadorMercado);
                $percentualIndicadorExcelencia = str_replace(".", ",", $percentualIndicadorExcelencia);
            }
        }

        $verticalPeriodicidade = Vertical::PERIODO_UNICO;
        if ($coletaReferencia && $coletaReferencia->vertical) {

            $verticalColetaReferencia = $coletaReferencia->vertical;

            if ($verticalColetaReferencia->periodicidade == Vertical::PERIODO_DIARIO) {
                $verticalPeriodicidade = $verticalColetaReferencia->periodicidade;
            }
        }

        $parametrosCliente = ClienteTemParametro::find()
            ->where(['cliente_id' => $contexto->cliente_id, 'status' => ClienteTemParametro::ATIVO,])
            ->all();

        $parametrosContexto = ContextoTemParametro::find()
            ->where(['contexto_id' => $contexto->id, 'status' => ContextoTemParametro::ATIVO,])
            ->all();

        $parametrosLabel = [];
        foreach ($parametrosCliente as $parametroCliente) {
            if ($parametroCliente->tipo == ClienteTemParametro::LABEL) {
                $parametrosLabel[$parametroCliente->parametro] = $parametroCliente->valor;
            }
        }
        foreach ($parametrosContexto as $parametroContexto) {
            if ($parametroContexto->tipo == ContextoTemParametro::LABEL) {
                $parametrosLabel[$parametroContexto->parametro] = $parametroContexto->informacao;
            }
        }

        $verticeUltimaColeta = null;
        $coletaEstruturaPvfs = null;

        $minProjeto = -20;
        $maxProjeto = 120;

        $faixasPadrao = [];
        $plots = [];

        if ($coletaReferencia) {

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

            $coletaEstruturaPvfs = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coletaReferencia->id,
                    'cod_pai' => $verticeColetaReferencia ? $verticeColetaReferencia->id : null,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->orderBy('ordem ASC')
                ->all();

            $faixasPadrao = $coletaReferencia->faixasPadrao;

            foreach ($faixasPadrao as $key => $v) {

                //list($r, $g, $b) = sscanf($v['color'], "#%02x%02x%02x");
                //$plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];

                $plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => str_replace(",0.9", ",0.4", $v['color']), 'zIndex' => 0];

                if ($v["from"] < $minProjeto) {
                    $minProjeto = $v["from"];
                }
                if ($v["to"] > $maxProjeto) {
                    $maxProjeto = $v["to"];
                }
            }
        }

        $coletaApoioIndicacoresComprometedor = 0;
        $coletaApoioIndicacoresMercado = 0;
        $coletaApoioIndicacoresExcelencia = 0;
        $coletaApoiolistaValoresIndicadores = [];
        $coletaApoioEstruturaPvf = [];

        if ($coletaApoio) {

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

            $coletaApoioEstruturaPvf = ArrayHelper::map(ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coletaApoio->id,
                    'cod_pai' => $verticeColetaApoio ? $verticeColetaApoio->id : null,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->orderBy('ordem ASC')
                ->all(), 'nome', 'pontuacao');

            $coletaApoioIndicadores = ColetaIndicador::find()
                ->select([
                    'coleta_indicador.id as id',
                    'coleta_indicador.nome as nome',
                    'coleta_indicador.pontuacao as pontuacao',
                    'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                    'coleta_indicador.conceito as conceito',
                    'coleta_indicador.estrutura_id as estrutura_id',
                    'vertical_indicador.usa_interpolacao as usainterpolacao',
                ])
                ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                ->where([
                    'coleta_estrutura.coleta_id' => $coletaApoio->id,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO
                ])
                ->asArray()
                ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                ->all();

            foreach ($coletaApoioIndicadores as $coletaApoioIndicador) {
                if ($coletaApoioIndicador['pontuacao'] >= $minimoExcelencia) {
                    $coletaApoioIndicacoresExcelencia++;
                } elseif ($coletaApoioIndicador['pontuacao'] <= $minimoComprometedor) {
                    $coletaApoioIndicacoresComprometedor++;
                } else {
                    $coletaApoioIndicacoresMercado++;
                }

                $coletaApoiolistaValoresIndicadores[] = ['y' => (int) $coletaApoioIndicador['pontuacao']];
            }
        }

        $responsaveis = [];
        $dadosVerticalIndicadorResponsavel = [];
        $indicadorResponsavelOrdem = [];

        if ($coletaReferencia) {

            //            $dadosResponsaveis = VerticalIndicadorTemParametro::find()
            //                    ->join('LEFT JOIN', 'coleta_indicador', 'vertical_indicador_tem_parametro.vertical_indicador_id=coleta_indicador.vertical_indicador_id')
            //                    ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_indicador.estrutura_id=coleta_estrutura.id')
            //                    ->where([
            //                        'vertical_indicador_tem_parametro.parametro' => 'Responsável',
            //                        'coleta_estrutura.coleta_id' => $coletaReferencia->id,
            //                        'vertical_indicador_tem_parametro.status' => VerticalIndicadorTemParametro::ATIVO,
            //                        'coleta_indicador.status' => ColetaIndicador::ATIVO,
            //                        'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
            //                    ])
            //                    ->orderBy('vertical_indicador_tem_parametro.valor')
            //                    ->all();
            //
            //
            //            foreach ($dadosResponsaveis as $dadoResponsavel) {
            //                $responsaveis[str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor))] = $dadoResponsavel->valor;
            //
            //                $dadosVerticalIndicadorResponsavel[$dadoResponsavel->vertical_indicador_id] = str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor));
            //            }
            //            foreach ($coletaReferenciaIndicadores as $indicadorColetaAll) {
            //
            //                if (isset($dadosVerticalIndicadorResponsavel[$indicadorColetaAll['vertical_indicador_id']])) {
            //                    $indicadorResponsavelOrdem[] = $dadosVerticalIndicadorResponsavel[$indicadorColetaAll['vertical_indicador_id']];
            //                } else {
            //                    $indicadorResponsavelOrdem[] = '';
            //                }
            //            }
        }

        $dadosContexto = [];

        //        $fotos = Foto::find()
        //                ->joinWith('coleta')
        //                ->where([
        //                    'foto.status' => Foto::ATIVO,
        //                    'coleta.status' => Coleta::ATIVO,
        //                ])
        //                ->andwhere(['in', 'coleta.id', $coletasIds])
        //                ->all();
        //        $timelines = Timeline::find()
        //                ->where([
        //                    'tipo' => Timeline::TIPO_CONTEXTO,
        //                    'vinculo' => $contexto->id,
        //                    'status' => Timeline::ATIVO,
        //                ])
        //                ->orderBy('data_cadastro DESC')
        //                ->all();

        //        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
        //                ->joinWith(['createdBy'])
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
        //                ])
        //                ->orderBy('prioridade ASC, id DESC')
        //                ->all();
        //
        //        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];



        $totalDisco = 0;
        //        foreach ($anexos as $anexo) {
        //            $totalDisco += $anexo['tamanho'];
        //        }
        $totalGB = round(($totalDisco / 1000000000), 3);
        $percentualDisco = round($totalGB / $contexto->cota_disco, 3);

        if ($percentualDisco >= 80) {
            $bgDisco = 'red';
        } elseif ($percentualDisco >= 60) {
            $bgDisco = 'orange';
        } elseif ($percentualDisco >= 40) {
            $bgDisco = 'yellow';
        } elseif ($percentualDisco >= 20) {
            $bgDisco = 'blue';
        } else {
            $bgDisco = 'green';
        }

        if ($percentualDisco > 60) {
            Yii::$app->mailer->compose('_cota_contexto', [
                'contexto' => $contexto,
                'percentualDisco' => $percentualDisco,
            ])
                ->setFrom(['no-reply@krinom.com.br' => 'Accia'])
                ->setTo('gledson@krinom.com.br')
                ->setSubject('Contexto com uso de cota de disco elevada na Accia')
                ->send();
        }

        $totalGB = str_replace(".", ",", $totalGB);

        $contatos = '';
        foreach ($contexto->contextoTemContatos as $contextoContato) {
            if ($contextoContato->status == ContextoTemContato::ATIVO) {
                $contatos .= $contextoContato->contato . "<br />";
            }
        }


        $docsExiste = [];

        foreach ($contexto->cliente->clienteTemDocs as $clienteTemDoc) {
            if ($clienteTemDoc->status == ClienteTemDocs::ATIVO) {
                $docsExiste[] = $clienteTemDoc->doc;
            }
        }

        //        $pesePlanoAplicacaoFullModel = PesePlanoAplicacao::find()
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'tipo' => PesePlanoAplicacao::FULL,
        //                    'status' => PesePlanoAplicacao::ATIVO,
        //                ])
        //                ->one();
        //
        //        $pesePlanoAplicacaoFull = PesePlanoAplicacao::full($pesePlanoAplicacaoFullModel);
        //
        //        $pesePlanoAplicacaoBasicModel = PesePlanoAplicacao::find()
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'tipo' => PesePlanoAplicacao::BASIC,
        //                    'status' => PesePlanoAplicacao::ATIVO,
        //                ])
        //                ->one();
        //
        //        $pesePlanoAplicacaoBasic = PesePlanoAplicacao::basic($pesePlanoAplicacaoBasicModel);
        //
        //        $pesePlanoAplicacaoDashboard = PesePlanoAplicacao::dashboard($pesePlanoAplicacaoFullModel, $pesePlanoAplicacaoBasicModel);
        //
        //        $planoAplicacaoSegmentos = \yii\helpers\ArrayHelper::map(
        //                        PeseSegmento::find()
        //                                ->where(['status' => PeseSegmento::ATIVO])
        //                                ->orderBy('descricao ASC')->all(),
        //                        'id', 'descricao');
        //
        //        $servicosContratados = ContextoTemServico::find()
        //                ->select('servico')
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'status' => ContextoTemServico::ATIVO,
        //                ])
        //                ->column();

        $isCeon = Logged::isCeon();

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

        $coresPadrao = [];
        $coresPadrao[0] = \app\modules\risk\models\RiscoCenario::COR_BAIXO;
        $coresPadrao[1] = \app\modules\risk\models\RiscoCenario::COR_MODERADO;
        $coresPadrao[2] = \app\modules\risk\models\RiscoCenario::COR_ALTO;
        $coresPadrao[3] = \app\modules\risk\models\RiscoCenario::COR_CRITICO;


        $coresPadrao = [];
        $coresPadrao[0] = 'rgba(8,159,80, 0.15)';
        $coresPadrao[1] = 'rgba(232,221,17, 0.15)';
        $coresPadrao[2] = 'rgba(223,83,83, 0.15)';
        $coresPadrao[3] = 'rgba(223,83,83, 0.15)';


        $riscoCenario = \app\modules\risk\models\RiscoCenario::find()
            ->where(['status' => RiscoCenario::ATIVO])
            ->andWhere(['in', 'coleta_vinculo', $coletasIds])
            ->orderBy('id DESC')
            ->one();

        $riscosCategorias = [];
        $cores = [];
        $coresPadrao = [];
        $cenarios = [];

        if ($riscoCenario) {
            $riscosCategorias = \app\modules\risk\models\RiscoModelo::riscoCategoria($riscoCenario->riscoModelo);

            $cores = $riscoCenario->cores['cores'];
            $coresPadrao = $riscoCenario->cores['coresPadrao'];

            $cenarios = \app\modules\risk\models\RiscoCenario::find()
                ->join('LEFT JOIN', 'coleta', 'risco_cenario.coleta_vinculo=coleta.id')
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'risco_cenario.status' => \app\modules\risk\models\Risco::ATIVO,
                ])
                ->andWhere(['=', 'coleta.contexto_id', $contexto->id])
                ->all();
        }

        $todosCenarios = [];
        $todosCenariosPontuacao = [];
        $todosCenariosDrilldrown = [];
        $todosRiscos = [];
        $maxPontuacaoRisco = 0;

        foreach ($cenarios as $cenario) {


            /*
            if ($cenario->pontuacao <= 25) {
                $cor = $coresPadrao[0];
            } elseif ($cenario->pontuacao <= 50) {
                $cor = $coresPadrao[1];
            } elseif ($cenario->pontuacao <= 75) {
                $cor = $coresPadrao[2];
            } else {
                $cor = $coresPadrao[3];
            }
                */

            $todosCenariosPontuacao[] = [
                'name' => $cenario->nome,
                'id' => $cenario->id,
                'y' => $cenario->pontuacao,
                'color' => $cenario->corFaixa,
                'drilldown' => 'd' . $cenario->id,
                'tipo' => 'cenario',
                'dataLabels' => true,
            ];

            $r = 1;
            $riscos = $cenario->getRiscos()->where('status=1')->all();

            $todosCenarios[$cenario->id]['nome'] = $cenario->nome;
            $todosCenarios[$cenario->id]['coleta'] = $cenario->coleta_vinculo . ' - ' . $cenario->coletaVinculo->nome;
            $todosCenarios[$cenario->id]['coleta_vinculo'] = $cenario->coleta_vinculo;
            $todosCenarios[$cenario->id]['coleta-nome'] = $cenario->coletaVinculo->nome;
            $todosCenarios[$cenario->id]['riscos'] = $riscos;
            $todosCenarios[$cenario->id]['matrizConsequenciaProbabilidade'] = $cenario->matrizConsequenciaProbabilidade;
            $dataRisco = [];
            $riscosConsequenciaProbabilidade = [];

            foreach ($riscos as $risco) {

                $riscosConsequenciaProbabilidade[] = [
                    'id' => $risco->id,
                    'nome' => 'R' . $r . ' - ' . $risco->nome,
                    'consequencia' => $risco->consequencia_valor,
                    'consequencia_descricao' => $risco->consequencia_descricao,
                    'probabilidade' => $risco->probabilidade,
                ];

                $pontuacaoRisco = round($risco->consequencia_valor * ($risco->probabilidade / 100));

                //$todosRiscos[$r]['name'] = 'R' . $r;
                $todosRiscos[$r]['name'] = 'R' . $r . ' - ' . $risco->nome;
                $todosRiscos[$r]['type'] = 'line';
                $todosRiscos[$r]['data'][] = $pontuacaoRisco;
                $todosRiscos[$r]['tooltip']['valueSuffix'] = ' pts';
                $todosRiscos[$r]['dataLabels'] = false;

                if ($pontuacaoRisco > $maxPontuacaoRisco) {
                    $maxPontuacaoRisco = $pontuacaoRisco;
                }

                /*
                if ($risco->consequencia_descricao == 'Leve') {

                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[0];
                    } else {
                        $corRisco = $coresPadrao[0];
                    }
                } elseif ($risco->consequencia_descricao == 'Moderado') {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[1];
                    } else {
                        $corRisco = $coresPadrao[0];
                    }
                } elseif ($risco->consequencia_descricao == 'Grave') {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[1];
                    } else {
                        $corRisco = $coresPadrao[1];
                    }
                } else {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[3];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[2];
                    } else {
                        $corRisco = $coresPadrao[1];
                    }
                }
                    */


                $dataRisco[] = [
                    'name' => 'R' . $r,
                    'nameCompleto' => 'R' . $r . ' - ' . $risco->nome,
                    'id' => 'risco' . $risco->id,
                    'y' => $pontuacaoRisco,
                    'color' => $risco->corFaixa,
                    'tipo' => 'risco',
                    'consequencia' => $risco->consequencia_descricao,
                    'probabilidade' => $risco->probabilidade . '%',
                    'tooltip' => [
                        'formatter' => " function () { return 'Custom Format...'; }",
                    ],
                    'dataLabels' => true,
                ];

                $r++;
            }

            $todosCenariosDrilldrown[] = [
                'id' => 'd' . $cenario->id,
                'name' => $cenario->nome,
                'data' => $dataRisco,
                'pointWidth' => 50,
                //'pointWidth' => count($dataRisco) <= 1 ? 50 : 'null',
            ];

            $todosCenarios[$cenario->id]['riscosConsequenciaProbabilidade'] = $riscosConsequenciaProbabilidade;
        }

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

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

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

        //    Utils::debug($permiteEditar);

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

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


        $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);

        $analisesRegulatoriasContexto = \app\models\ContextoTemAnaliseRegulatoria::find()
            ->where(['contexto_id' => $contexto->id])
            ->all();

        $planoAcaos = PlanoAcao::find()
            ->where([
                'contexto_id' => $contexto->id,
                'status' => PlanoAcao::ATIVO,
            ])
            ->all();

        $licenciado = 0;
        if ($contexto->tipoLicenca == 'Licenciado') {
            $licenciado = 1;
        }

        $fluxoInventario = 0;
        $fluxoColeta = 0;
        $fluxoRisco = 0;
        $fluxoPlanoAcao = 0;
        $fluxoDocsAdequacao = 0;

        /*
        $fluxoInventario = \app\models\InventarioResposta::percentualInventarioRespondido($contexto);
        $fluxoColeta = \app\modules\performance\models\Coleta::percentualColetaRespondido($contexto, $coletaReferencia);
        $fluxoRisco = \app\modules\risk\models\RiscoCenario::percentualRiscoRespondido($todosCenarios);
        $fluxoPlanoAcao = \app\modules\performance\models\PlanoAcao::percentualPlanoAcaoCriados($contexto, $coletaReferencia, $coletaReferenciaListaIndicacoresComprometedor);
        $fluxoDocsAdequacao = \app\modules\performance\models\ColetaIndicador::percentualDocsAdequacaoCriados($contexto, $coletaReferencia);
        */
        //Utils::debug($fluxoRisco);


        $niveisValorGlobal = [];
        $niveisValorGlobal[] = ["from" => -20, "to" => 40, "color" => "#c80a2d", "label" => "Comprometedor"];
        $niveisValorGlobal[] = ["from" => 40.01, "to" => 80, "color" => "#FFD23E", "label" => "Mercado"];
        $niveisValorGlobal[] = ["from" => 80.01, "to" => 120, "color" => "#21C044", "Excelência"];
        $plots = [];
        foreach ($niveisValorGlobal as $key => $v) {

            list($r, $g, $b) = sscanf($v['color'], "#%02x%02x%02x");
            $plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', .15)', 'zIndex' => 0];
        }

        $legislacaoCorrespondentes = \app\models\InventarioResposta::find()
            ->join('LEFT JOIN', 'scope', 'scope.id=inventario_resposta.scope_id')
            ->join('LEFT JOIN', 'inventario_pergunta', 'inventario_pergunta.id=inventario_resposta.inventario_pergunta_id')
            ->join('LEFT JOIN', 'inventario_scope', 'inventario_scope.id=inventario_resposta.inventario_scope_id')
            ->where([
                'scope.contexto_id' => $contexto->id,
                'inventario_pergunta.tipo' => \app\models\InventarioPergunta::PERGUNTA_LEGISLACAO,
                'inventario_scope.status' => \app\models\InventarioScope::ATIVO,
            ])
            ->all();

        $processoScopes = \app\models\InventarioScope::find()
            ->join('LEFT JOIN', 'scope', 'scope.id=inventario_scope.scope_id')
            ->join('LEFT JOIN', 'inventario_dados', 'inventario_dados.id=inventario_scope.inventario_dados_id')
            ->where([
                'inventario_scope.status' => \app\models\InventarioScope::ATIVO,
                'scope.status' => \app\models\Scope::ATIVO,
            ])
            ->andWhere(['=', 'scope.contexto_id', $contexto->id])
            ->andWhere([
                'in',
                'inventario_dados.tipo',
                [
                    \app\models\InventarioDados::TIPO_ROPA,
                    \app\models\InventarioDados::TIPO_FORNECEDOR,
                    \app\models\InventarioDados::TIPO_SEGURANCA,
                ]
            ])
            ->orderBy('inventario_dados.tipo ASC')
            ->all();

        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $contexto->id,
                'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
            ])
            ->orderBy('prioridade ASC, id DESC')
            ->all();

        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

        $anexoArvore = \app\modules\performance\models\AnexoArvore::estrutura($contexto->id, $aplicacao ?? null);

        $anexoArvoreIds = \app\modules\performance\models\AnexoArvore::find()
            ->select('id')
            ->where(['contexto_id' => $contexto->id])
            ->column();

        $anexos = Anexo::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $contexto->id,
                'anexo.status' => Anexo::ATIVO
            ])
            ->andWhere([
                'OR',
                ['not in', 'anexo_arvore_id', $anexoArvoreIds],
                ['is', 'anexo_arvore_id', new \yii\db\Expression('null')]
            ])
            ->orderBy('id ASC')
            ->all();

        $anexoRespostas = \app\models\InventarioResposta::find()
            ->joinWith('scope')
            ->where([
                'aplica' => \app\models\InventarioResposta::APLICA_SIM,
                'scope.status' => \app\models\Scope::ATIVO,
                'scope.contexto_id' => $contexto->id,
            ])
            ->andWhere([
                'OR',
                ['is not', 'sim_nao_anexo', new \yii\db\Expression('null')],
                ['is not', 'anexo', new \yii\db\Expression('null')]
            ])
            ->andWhere([
                'OR',
                ['not in', 'anexo_arvore_id', $anexoArvoreIds],
                ['is', 'anexo_arvore_id', new \yii\db\Expression('null')]
            ])
            ->orderBy('id ASC')
            ->all();

        //Utils::debug($anexoRespostas);

        $searchModelRopa = new \app\models\InventarioScopeSearch();
        $dataProviderRopa = $searchModelRopa->searchRopa(Yii::$app->request->queryParams, $contexto);

        $searchModelFornecedor = new \app\models\InventarioScopeSearch();
        $dataProviderFornecedor = $searchModelFornecedor->searchModelFornecedor(Yii::$app->request->queryParams, $contexto);

        $searchModelSiti = new \app\models\InventarioScopeSearch();
        $dataProviderSiti = $searchModelSiti->searchModelSiti(Yii::$app->request->queryParams, $contexto);

        $searchInventarioDadosTodos = new \app\models\InventarioScopeSearch();
        $dataProviderInventarioDadosTodos = $searchInventarioDadosTodos->searchTodos(Yii::$app->request->queryParams, $contexto);

        $listaInventarioDados = ArrayHelper::map(InventarioDados::find()
            ->where([
                'status' => InventarioDados::ATIVO,
            ])
            ->all(), 'id', 'nome');

        $fotos = Foto::find()
            ->joinWith(['coleta', 'estrutura', 'indicador'])
            ->where([
                'foto.status' => Foto::ATIVO,
                'coleta.contexto_id' => $contexto->id,
                //    'coleta.status' => Coleta::ATIVO,
            ])
            ->orderBy('coleta_estrutura.id ASC, coleta_indicador.ordem_estruturada ASC, foto.id ASC')
            ->all();

        $timelines = Timeline::find()
            ->where([
                'tipo' => Timeline::TIPO_CONTEXTO,
                'vinculo' => $contexto->id,
                'status' => Timeline::ATIVO,
            ])
            ->orderBy('data_cadastro DESC')
            ->all();

        // Utils::debug($contexto->id);

        //operational
        $ocorrenciasDia = Ocorrencia::find()
            ->joinWith('cliente')
            ->where([
                'contexto_id' => $contexto->id,
                'co_ocorrencia.isDeleted' => Ocorrencia::NAO_EXCLUIDA,
            ])
            //   ->andwhere(['in', 'co_ocorrencia.status', [Ocorrencia::STATUS_NOVA, Ocorrencia::STATUS_EM_ANDAMENTO, Ocorrencia::STATUS_FINALIZADA]])
            ->andWhere(['like', 'co_ocorrencia.created_at', date('Y-m-d')])
            ->all();

        $totalOcorrenciasDia = 0;
        $andamentoOcorrenciasDia = 0;
        $destaqueOcorrenciasDia = 0;
        $destaqueOcorrenciasDiaInfo = '';

        $h01 = 0;
        $h02 = 0;
        $h03 = 0;
        $h04 = 0;
        $h05 = 0;
        $h06 = 0;
        $h07 = 0;
        $h08 = 0;
        $h09 = 0;
        $h10 = 0;
        $h11 = 0;
        $h12 = 0;
        $h13 = 0;
        $h14 = 0;
        $h15 = 0;
        $h16 = 0;
        $h17 = 0;
        $h18 = 0;
        $h19 = 0;
        $h20 = 0;
        $h21 = 0;
        $h22 = 0;
        $h23 = 0;

        foreach ($ocorrenciasDia as $ocorrenciaDia) {

            if (in_array($ocorrenciaDia->status, [Ocorrencia::STATUS_NOVA, Ocorrencia::STATUS_EM_ANDAMENTO])) {
                $andamentoOcorrenciasDia++;
            }
            $totalOcorrenciasDia++;

            if ($ocorrenciaDia->tipo->destaque) {
                $destaqueOcorrenciasDia++;
                $destaqueOcorrenciasDiaInfo = $ocorrenciaDia->tipo->nome . ' - ' . substr($ocorrenciaDia->created_at, 0, 10) . ' - ' . substr($ocorrenciaDia->created_at, 10, 6);
            }

            switch (substr($ocorrenciaDia->created_at, 11, 2)) {
                case '01':
                    $h01++;
                    break;
                case '02':
                    $h02++;
                    break;
                case '03':
                    $h03++;
                    break;
                case '04':
                    $h04++;
                    break;
                case '05':
                    $h05++;
                    break;
                case '06':
                    $h06++;
                    break;
                case '07':
                    $h07++;
                    break;
                case '08':
                    $h08++;
                    break;
                case '09':
                    $h09++;
                    break;
                case '10':
                    $h10++;
                    break;
                case '11':
                    $h11++;
                    break;
                case '12':
                    $h12++;
                    break;
                case '13':
                    $h13++;
                    break;
                case '14':
                    $h14++;
                    break;
                case '15':
                    $h15++;
                    break;
                case '16':
                    $h16++;
                    break;
                case '17':
                    $h17++;
                    break;
                case '18':
                    $h18++;
                    break;
                case '19':
                    $h19++;
                    break;
                case '20':
                    $h20++;
                    break;
                case '21':
                    $h21++;
                    break;
                case '22':
                    $h22++;
                    break;
                case '23':
                    $h23++;
                    break;
            }
        }

        $dados = [$h01, $h02, $h03, $h04, $h05, $h06, $h07, $h08, $h09, $h10, $h11, $h12, $h13, $h14, $h15, $h16, $h17, $h18, $h19, $h20, $h21, $h22, $h23];

        $ocorrenciasTodas = Ocorrencia::find()
            ->where(['isDeleted' => Ocorrencia::NAO_EXCLUIDA])
            ->count();

        $searchModelOcorrencia = new OcorrenciaSearch();

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

        $dataProviderOcorrencia = $searchModelOcorrencia->searchDashboard(Yii::$app->request->queryParams);

        $searchModelChecklistEquipamento = new AtivosChecklistSearch();
        $searchModelChecklistEquipamento->contexto_id = $contexto->id;
        $dataProviderChecklistEquipamento = $searchModelChecklistEquipamento->search(Yii::$app->request->queryParams);
        $dataProviderChecklistEquipamento->pagination->pageSize = 50;


        $searchModelChecklistHumana = new ChecklistHumanasSearch();
        $searchModelChecklistHumana->contexto_id = $contexto->id;
        $dataProviderChecklistHumana = $searchModelChecklistHumana->search(Yii::$app->request->queryParams);
        $dataProviderChecklistHumana->pagination->pageSize = 50;

        $contextoTemModulos = ContextoTemModulo::find()
            ->select('modulo')
            ->where(['contexto_id' => $contexto->id])
            ->column();

        $checklistAtivos = ChecklistAtivos::find()
            ->joinWith('contexto')
            ->where(['contexto.id' => $contexto->id])
            ->all();

        $checklistAtivosComProblemas = \app\modules\operational\models\Ativo::find()
            ->alias('t')
            ->join('INNER JOIN', 'co_contexto_tem_local ctl', 'ctl.id = t.contexto_tem_local_id')
            ->join('INNER JOIN', 'contexto contexto', 'contexto.id = ctl.contexto_id')
            ->join('INNER JOIN', 'cliente cliente', 'cliente.id = contexto.cliente_id')
            ->join('INNER JOIN', 'co_local local', 'ctl.co_local_id = local.id')
            ->join('LEFT JOIN', 'co_checklist_ativos cl1', 'cl1.co_ativo_id = t.id AND cl1.id IN (SELECT MAX(cl2.id) FROM co_checklist_ativos AS cl2 WHERE cl2.co_ativo_id = t.id)')
            ->where('t.rgt-t.lft=1')
            ->where(['contexto.id' => $contexto->id])
            ->andWhere(['=', 't.active', 1])
            ->andWhere(['=', 'contexto.active', 1])
            ->andWhere(['=', 'cliente.status', 1])
            ->andWhere(['in', 'cl1.co_ativo_status_id', [
                \app\modules\operational\models\AtivoStatus::STATUS_FUNCIONANDO_COM_PROBLEMAS,
                \app\modules\operational\models\AtivoStatus::STATUS_NAO_FUNCIONANDO,
            ]])
            ->groupBy('cl1.co_ativo_id')
            ->all();

        $funcionamentoSis = 100;
        if ($checklistAtivos) {
            $funcionamentoSis = str_replace('.', ',', round((count($checklistAtivosComProblemas) / count($checklistAtivos) * 100), 2));
        }

        $funcionamentoSisInfo = '';
        if ($checklistAtivosComProblemas) {

            if ($checklistAtivosComProblemas[0]->co_ativo_status_id == AtivoStatus::STATUS_NAO_FUNCIONANDO) {
                $ativoStatus = 'Não funcionando';
            } else {
                $ativoStatus = 'Com problemas técnicos';
            }

            $funcionamentoSisInfo = $checklistAtivosComProblemas[0]->name;
        }
        // Utils::debug($funcionamentoSis);

        $pesePlanoAplicacaoFull = PesePlanoAplicacao::find()->where([
            'contexto_id' => $contexto->id,
            'tipo' => PesePlanoAplicacao::FULL,
            'status' => PesePlanoAplicacao::ATIVO
        ])->one();
        $planoAplicacaoFull = '';

        $planoAplicacaoSegmentos = [];

        $idPeseFull = null;
        $idPeseBasic = null;

        if (!$pesePlanoAplicacaoFull) {
            $planoAplicacaoFull .= '<br /><div><i>Aguardando cadastro do Plano de Aplicação Full</i></div>';
        } else {

            $idPeseFull = $pesePlanoAplicacaoFull->id;

            $planoAplicacaoFull .= '<br />';

            $segmento = null;

            $segs = PeseSegmento::find()->where(['status' => PeseSegmento::ATIVO])->orderBy('descricao ASC')->all();


            foreach ($segs as $seg) {

                $planoAplicacaoFull .= '<br /><h4><b>' . $seg->descricao . '</h4></b></h4>';

                $planoAplicacaoFull .= PesePlanoAplicacao::subTotal($pesePlanoAplicacaoFull->id, $seg->id);

                $planoAplicacaoSegmentos[$seg->id] = $seg->descricao;

                $planoAplicacaoFull .= '
                    <table class="table table-bordered table-striped table-condensed">
                        <thead>
                            <th class="col-sm-2">Área de Preocupação</th>
			    <th class="col-sm-4">Ambiente</th>	
                            <th class="col-sm-4">Localização</th>
                            <th class="col-sm-1">Equipamento</th>
                            <th class="col-sm-1">Tag</th>
                        </thead>
                        <tbody>';



                $epql = PeseEquipamento::find()->select('id')->where(['pese_segmento_id' => $seg->id])->column();

                $epal = $equip1 = PesePlanoAplicacaoEquipamento::find()->where(['pese_plano_aplicacao_id' => $pesePlanoAplicacaoFull->id])->andWhere(['in', 'pese_equipamento_id', $epql])->orderby('area_preocupacao ASC, ordem ASC')->all();

                foreach ($epal as $e) {
                    $ap = [1 => 'Limites Perimetrais', 2 => 'Controle de Acessos', 3 => 'Áreas de Circulação', 4 => 'Ambientes Específicos'];

                    if (isset($ap[$e->area_preocupacao])) {
                        $a = $ap[$e->area_preocupacao];
                    } else {
                        $a = '';
                    }
                    $planoAplicacaoFull .= '<tr><td>' . $a . '</td><td>' . $e->ambiente . '</td><td>' . $e->localizacao . '</td><td>' . $e->peseEquipamento->descricao . '</td><td>' . $e->tag . '</td></tr>';
                }

                $planoAplicacaoFull .= '</tbody></table>';
            }
        }

        $pesePlanoAplicacaoBasic = PesePlanoAplicacao::find()->where([
            'contexto_id' => $contexto->id,
            'tipo' => PesePlanoAplicacao::BASIC,
            'status' => PesePlanoAplicacao::ATIVO,
        ])->one();

        $planoAplicacaoBasic = '';
        if (!$pesePlanoAplicacaoBasic) {

            $planoAplicacaoBasic .= '<br /><div><i>Aguardando cadastro do Plano de Aplicação Basic</i></div>';
        } else {

            $idPeseBasic = $pesePlanoAplicacaoBasic->id;

            $planoAplicacaoBasic .= '<br />';

            $segmento = null;

            $ep = '';

            $segs = PeseSegmento::find()->where(['status' => PeseSegmento::ATIVO])->orderBy('descricao ASC')->all();


            foreach ($segs as $seg) {

                $planoAplicacaoBasic .= '<br /><h4><b>' . $seg->descricao . '</h4></b></h4>';

                $planoAplicacaoBasic .= PesePlanoAplicacao::subTotal($pesePlanoAplicacaoBasic->id, $seg->id);

                $planoAplicacaoBasic .= '
                    <table class="table table-bordered table-striped table-condensed">
                        <thead>
                            <th class="col-sm-2">Área de Preocupação</th>
			    <th class="col-sm-4">Ambiente</th>	
                            <th class="col-sm-4">Localização</th>
                            <th class="col-sm-1">Equipamento</th>
                            <th class="col-sm-1">Tag</th>
                        </thead>
                        <tbody>';


                $epql = PeseEquipamento::find()->select('id')->where(['pese_segmento_id' => $seg->id])->column();

                $epal = $equip1 = PesePlanoAplicacaoEquipamento::find()->where(['pese_plano_aplicacao_id' => $pesePlanoAplicacaoBasic->id])->andWhere(['in', 'pese_equipamento_id', $epql])->orderby('area_preocupacao ASC, ordem ASC')->all();

                foreach ($epal as $e) {
                    $ap = [1 => 'Limites Perimetrais', 2 => 'Controle de Acessos', 3 => 'Áreas de Circulação', 4 => 'Ambientes Específicos'];

                    if (isset($ap[$e->area_preocupacao])) {
                        $a = $ap[$e->area_preocupacao];
                    } else {
                        $a = '';
                    }
                    $planoAplicacaoBasic .= '<tr><td>' . $a . '</td><td>' . $e->ambiente . '</td><td>' . $e->localizacao . '</td><td>' . $e->peseEquipamento->descricao . '</td><td>' . $e->tag . '</td></tr>';
                }

                $planoAplicacaoBasic .= '</tbody></table>';
            }
        }

        $clienteTemParametrosLabel = ArrayHelper::map(
            ClienteTemParametro::find()
                ->where([
                    'cliente_id' => $contexto->cliente_id,
                    'tipo' => ClienteTemParametro::LABEL,
                ])
                ->all(),
            'parametro',
            'valor'
        );

        $planoAcaos = PlanoAcao::find()
            ->where([
                'contexto_id' => $contexto->id,
            ])
            ->andWhere(['!=', 'status', PlanoAcao::INATIVO])
            ->all();

        $planosAcaoStatusCadastrado = 0;
        $planosAcaoStatusEmAndamento = 0;
        $planosAcaoStatusConcluido = 0;
        $planosAcaoStatusHomologado = 0;
        $planosAcaoStatusRecusado = 0;
        $totalAcaoProposta = 0;

        $planosAcaoQtdeAcaoProposta = [];

        foreach ($planoAcaos as $planoAcao) {

            $planosAcaoQtdeAcaoProposta[] = ['plano' => $planoAcao->nome, "qtde" => $planoAcao->qtdeAcaoProposta];

            $totalAcaoProposta += $planoAcao->qtdeAcaoProposta;

            if ($planoAcao->status == PlanoAcao::STATUS_CADASTRADO) {
                $planosAcaoStatusCadastrado++;
            }
            if ($planoAcao->status == PlanoAcao::STATUS_EM_ANDAMENTO) {
                $planosAcaoStatusEmAndamento++;
            }
            if ($planoAcao->status == PlanoAcao::STATUS_CONCLUIDO) {
                $planosAcaoStatusConcluido++;
            }
            if ($planoAcao->status == PlanoAcao::STATUS_HOMOLOGADO) {
                $planosAcaoStatusHomologado++;
            }
            if ($planoAcao->status == PlanoAcao::STATUS_RECUSADO) {
                $planosAcaoStatusRecusado++;
            }
        }

        $planosAcaoStatus = [
            ["status" => "Cadastrado", "qtde" => $planosAcaoStatusCadastrado, 'color' => PlanoAcao::STATUS_CADASTRADO_COR],
            ["status" => "Em andamento", "qtde" => $planosAcaoStatusEmAndamento, 'color' => PlanoAcao::STATUS_EM_ANDAMENTO_COR],
            ["status" => "Concluído", "qtde" => $planosAcaoStatusConcluido, 'color' => PlanoAcao::STATUS_CONCLUIDO_COR],
            ["status" => "Homologado", "qtde" => $planosAcaoStatusHomologado, 'color' => PlanoAcao::STATUS_HOMOLOGADO_COR],
            ["status" => "Recusado", "qtde" => $planosAcaoStatusRecusado, 'color' => PlanoAcao::STATUS_RECUSADO_COR],
        ];

        $listaColetasComparativoPostado = [];
        $listaColetasComparativo = [];
        foreach ($coletas as $coleta) {
            $listaColetasComparativo[$coleta->id] = $coleta->nome;
        }

        $indiceIndicadorComparativo = 0;

        $coletasPerfilDesempenhoComparativo = [];

        $coletaIndicadoresComparativo = [];

        if (isset($_POST['comparativo'])) {

            $listaColetasComparativoPostado = $_POST['comparativo'];

            foreach ($coletas as $coleta) {
                if (in_array($coleta->id, $_POST['comparativo'])) {
                    $coletaComparativoIndicadores = ColetaIndicador::find()
                        ->select([
                            'coleta_indicador.id as id',
                            'coleta_indicador.nome as nome',
                            'coleta_indicador.pontuacao as pontuacao',
                            'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                            'coleta_indicador.conceito as conceito',
                            'coleta_indicador.estrutura_id as estrutura_id',
                            'vertical_indicador.usa_interpolacao as usainterpolacao',
                        ])
                        ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                        ->where([
                            'coleta_estrutura.coleta_id' => $coleta->id,
                            'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                            'coleta_indicador.status' => ColetaIndicador::ATIVO
                        ])
                        ->asArray()
                        ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                        ->all();


                    $coletaComparativolistaValoresIndicadores = [];
                    $z = 0;
                    foreach ($coletaComparativoIndicadores as $k => $coletaComparativoIndicador) {
                        $coletaComparativolistaValoresIndicadores[] = ['y' => (int) $coletaComparativoIndicador['pontuacao']];

                        $coletaComparativoIndicador['ordem'] = $indiceIndicadorComparativo;


                        if (isset($pareceresTecnicosVerticalIndicador[$coletaComparativoIndicador['vertical_indicador_id']])) {

                            $coletaComparativoIndicadores[$z]['parecer_indicador'] = 'sim';
                        }

                        $indiceIndicadorComparativo++;
                        $z++;
                    }



                    $coletasPerfilDesempenhoComparativo[] = [
                        'name' => $coleta->nome ?? 'N/D',
                        'data' => $coletaComparativolistaValoresIndicadores,
                        'coletaid' => $coleta->id,
                    ];

                    $coletaIndicadoresComparativo[$coleta->id] = $coletaComparativoIndicadores;
                }

                //Utils::debug($coletaComparativolistaValoresIndicadores);
            }
        } else {
            $coletasPerfilDesempenhoComparativo[] = [
                'name' => $coletaReferencia->nome ?? 'N/D',
                'data' => $listaValoresIndicadores,
                'coletaid' => $coletaReferencia->id ?? null,
            ];

            $coletaIndicadoresComparativo[$coletaReferencia->id ?? 0] = $coletaReferenciaIndicadores;
        }

        $ocorrenciasTodas = Ocorrencia::find()
            ->joinWith('cliente')
            ->where([
                'contexto_id' => $contexto->id,
                'co_ocorrencia.isDeleted' => Ocorrencia::NAO_EXCLUIDA,
            ])
            //   ->andwhere(['in', 'co_ocorrencia.status', [Ocorrencia::STATUS_NOVA, Ocorrencia::STATUS_EM_ANDAMENTO, Ocorrencia::STATUS_FINALIZADA]])
            ->all();

        //   Utils::debug($todosCenarios);

        if ($output == 'excel') {

            $dados = $dataProviderOcorrencia->query->all();

            /*
            $tabela = '<table>';
            $tabela .= '<tr><th>Destaque</th><th>Número</th><th>Data</th><th>Local</th><th>Tipo/Subtipo</th><th>Criticidade</th><th>Status</th></tr>';

            foreach ($dados as $dado) {

                $tabela .= '<tr>';
                $tabela .= '<td>' . $dado->getDestaqueSimNao() . '</td>';
                $tabela .= '<td>' . (string) $dado->ocorrenciaNumero . '</td>';
                $tabela .= '<td>' . substr(str_replace(":", "h", $dado->created_at), 0, 16) . '</td>';
                $tabela .= '<td>' . $dado->localDaOcorrencia->name . '</td>';
                $tabela .= '<td>' . $dado->tipo->nome . ' / ' . $dado->subtipo->nome . '</td>';
                $tabela .= '<td>' . $dado->analiseCriticidade . '</td>';
                $tabela .= '<td>' . Ocorrencia::LISTA_STATUS_ID_NAME[$dado->status] ?? "N/D" . '</td>';
                $tabela .= '</tr>';
            }

            $tabela .= '</table>';


            $filename = "Eventos monitorados " . date('Y-m-d-H_i_s') . ".xls";
            

            header("Content-Disposition: attachment; filename=\"$filename\"");
            header("Content-Type: application/vnd.ms-excel");
            echo $tabela;
            */


            \moonland\phpexcel\Excel::export([
                'isMultipleSheet' => false,
                'models' => $dados,
                'columns' => [
                    [
                        'header' => 'Destaque',
                        'value' => function ($model) {
                            return $model->getDestaqueSimNao();
                        }
                    ],
                    [
                        'header' => 'Número',
                        'value' => function ($model) {
                            return $model->ocorrenciaNumero;
                        }
                    ],
                    [
                        'header' => 'Data',
                        'value' => function ($model) {
                            return substr(str_replace(":", "h", $model->created_at), 0, 16);
                        }
                    ],
                    [
                        'header' => 'Local',
                        'value' => function ($model) {
                            return $model->localDaOcorrencia->name;
                        }
                    ],
                    [
                        'header' => 'Tipo/Subtipo',
                        'value' => function ($model) {
                            return $model->tipo->nome . ' / ' . $model->subtipo->nome;
                        }
                    ],
                    [
                        'header' => 'Relato dos Fatos',
                        'value' => function ($model) {

                         $texto = strip_tags($model->observacao);

                                // Decodifica entidades HTML
                                $texto = html_entity_decode($texto, ENT_QUOTES | ENT_HTML5, 'UTF-8');

                                // Remove espaços extras
                                $texto = trim($texto);
                            return $texto;
                        }
                    ],
                    [
                        'header' => 'Criticidade',
                        'value' => function ($model) {
                            return $model->analiseCriticidade;
                        }
                    ],
                    [
                        'header' => 'Status',
                        'value' => function ($model) {
                            return Ocorrencia::LISTA_STATUS_ID_NAME[$model->status] ?? "N/D";
                        }
                    ],
                    [
                        'header' => 'Timeline',
                        'value' => function ($model) {
                            $retorno = '';

                            $timelines = \app\modules\performance\models\Timeline::find()
                                ->where([
                                    'tipo' => \app\modules\performance\models\Timeline::TIPO_OCORRENCIA,
                                    'vinculo' => $model->id,
                                    'status' => \app\modules\performance\models\Timeline::ATIVO,
                                ])
                                ->orderBy('data_cadastro ASC')
                                ->all();
                            foreach ($timelines as $timeline) {

                                $data = date('d/m/Y H:i', strtotime($timeline->data_cadastro));


                                // Remove tags HTML
                                $texto = strip_tags($timeline->conteudo);

                                // Decodifica entidades HTML
                                $texto = html_entity_decode($texto, ENT_QUOTES | ENT_HTML5, 'UTF-8');

                                // Remove espaços extras
                                $texto = trim($texto);
                                $retorno .= $data . ' - ' . $texto
                                    . "\n";
                            }

                            return $retorno;
                        }
                    ],

                ],
                'fileName' => "Eventos monitorados " . date('Y-m-d-H_i_s'),
                'autoSize' => true,
                'asAttachment' => true,
            ]);

            exit();
        }

        $searchModelApuracao = new ApuracaoSearch();
        // $searchModelApuracao->contexto_id = $contexto->id;

        /*
        if (!$searchModelApuracao->status) {
            $searchModelApuracao->status = Apuracao::ATIVO;
        }
            */

        $dataProviderApuracao = $searchModelApuracao->search(Yii::$app->request->queryParams);

        $view = 'lgpdv2';

        if ($contexto->id == 648) {
            $view = 'eventos';
        }



        return $this->render($view, [
            'aplicacao' => $aplicacao,
            'model' => $contexto,
            'parametrosLabel' => $parametrosLabel,
            'coletaReferencia' => $coletaReferencia,
            'totalColetas' => $totalColetas,
            'valorGlobal' => $valorGlobal,
            'coletaValores' => $coletaValores,
            'coletaNomes' => $coletaNomes,
            'coletasIdNome' => $coletasIdNome,
            'percentual' => $percentual,
            'evolucao' => $evolucao,
            'totalIndicadores' => $totalIndicadores,
            'totalIndicadoresDemandamAtencao' => $totalIndicadoresDemandamAtencao,
            'verticalPeriodicidade' => $verticalPeriodicidade,
            'coletaEstruturaPvfs' => $coletaEstruturaPvfs,
            'parametrosContexto' => $parametrosContexto,
            'coletaReferenciaIndicadores' => $coletaReferenciaIndicadores,
            'coletaReferenciaIndicacoresComprometedor' => $coletaReferenciaIndicacoresComprometedor,
            'percentualIndicadorComprometedor' => $percentualIndicadorComprometedor,
            'coletaReferenciaListaIndicacoresComprometedor' => $coletaReferenciaListaIndicacoresComprometedor,
            'coletaReferenciaIndicacoresMercado' => $coletaReferenciaIndicacoresMercado,
            'percentualIndicadorMercado' => $percentualIndicadorMercado,
            'coletaReferenciaListaIndicacoresMercado' => $coletaReferenciaListaIndicacoresMercado,
            'coletaReferenciaIndicacoresExcelencia' => $coletaReferenciaIndicacoresExcelencia,
            'percentualIndicadorExcelencia' => $percentualIndicadorExcelencia,
            'coletaReferenciaListaIndicacoresExcelencia' => $coletaReferenciaListaIndicacoresExcelencia,
            'verticeColetaReferencia' => $verticeColetaReferencia,
            'minProjeto' => $minProjeto,
            'maxProjeto' => $maxProjeto,
            'responsaveis' => [],
            'faixasPadrao' => $faixasPadrao,
            'plots' => $plots,
            'listaNomeIndicadores' => $listaNomeIndicadores,
            'listaValoresIndicadores' => $listaValoresIndicadores,
            'indicadorResponsavelOrdem' => [],
            'pareceresTecnicos' => $pareceresTecnicos,
            'anexos' => $anexos,
            'contatos' => $contatos,
            'docsExiste' => $docsExiste,
            'isCeon' => $isCeon,
            'coletaApoio' => $coletaApoio,
            'coletaApoioEstruturaPvf' => $coletaApoioEstruturaPvf,
            'coletaApoioValorGlobal' => $coletaApoioValorGlobal,
            'coletaApoioIndicacoresComprometedor' => $coletaApoioIndicacoresComprometedor,
            'coletaApoioIndicacoresMercado' => $coletaApoioIndicacoresMercado,
            'coletaApoioIndicacoresExcelencia' => $coletaApoioIndicacoresExcelencia,
            'coletaApoiolistaValoresIndicadores' => $coletaApoiolistaValoresIndicadores,
            'riscoCenario' => $riscoCenario,
            'dadosVerticalIndicadorResponsavel' => $dadosVerticalIndicadorResponsavel,
            'coletaplanoacao' => $coletaplanoacao,
            'vertical_indicador_id' => $vertical_indicador_id,
            'todosCenariosPontuacao' => $todosCenariosPontuacao,
            'todosCenarios' => $todosCenarios,
            'todosRiscos' => $todosRiscos,
            'todosCenariosDrilldrown' => $todosCenariosDrilldrown,
            'riscosCategorias' => $riscosCategorias,
            'cores' => $cores,
            'coresPadrao' => $coresPadrao,
            'avisaPendencia' => $avisaPendencia,
            'botoes' => $botoes,
            'origem' => 'contexto',
            'permiteEditar' => $permiteEditar,
            'ultimasAtualizacoes' => $ultimasAtualizacoes,
            'organograma' => $organograma,
            'totalNotificacoes' => $totalNotificacoes,
            'analisesRegulatoriasContexto' => $analisesRegulatoriasContexto,
            'planoAcaos' => $planoAcaos,
            'licenciado' => $licenciado,
            'totalGB' => $totalGB,
            'percentualDisco' => $percentualDisco,
            'bgDisco' => $bgDisco,
            'fluxoInventario' => $fluxoInventario,
            'fluxoColeta' => $fluxoColeta,
            'fluxoPlanoAcao' => $fluxoPlanoAcao,
            'fluxoDocsAdequacao' => $fluxoDocsAdequacao,
            'fluxoRisco' => $fluxoRisco,
            'legislacaoCorrespondentes' => $legislacaoCorrespondentes,
            'processoScopes' => $processoScopes,
            'recomendacoesSeguranca' => $recomendacoesSeguranca,
            'prioridades' => $prioridades,
            'anexoArvore' => $anexoArvore,
            'searchModelRopa' => $searchModelRopa,
            'dataProviderRopa' => $dataProviderRopa,
            'searchModelFornecedor' => $searchModelFornecedor,
            'dataProviderFornecedor' => $dataProviderFornecedor,
            'searchModelSiti' => $searchModelSiti,
            'dataProviderSiti' => $dataProviderSiti,
            'searchInventarioDadosTodos' => $searchInventarioDadosTodos,
            'dataProviderInventarioDadosTodos' => $dataProviderInventarioDadosTodos,
            'listaInventarioDados' => $listaInventarioDados,
            'fotos' => $fotos,
            'anexoRespostas' => $anexoRespostas,
            'timelines' => $timelines,
            'totalOcorrenciasDia' => $totalOcorrenciasDia,
            'ocorrenciasDia' => $ocorrenciasDia,
            'andamentoOcorrenciasDia' => $andamentoOcorrenciasDia,
            'destaqueOcorrenciasDia' => $destaqueOcorrenciasDia,
            'destaqueOcorrenciasDiaInfo' => $destaqueOcorrenciasDiaInfo,
            'dados' => $dados,
            'searchModelOcorrencia' => $searchModelOcorrencia,
            'dataProviderOcorrencia' => $dataProviderOcorrencia,
            'ocorrenciasTodas' => $ocorrenciasTodas,
            'permiteEditarExcluir' => true,
            'searchModelChecklistEquipamento' => $searchModelChecklistEquipamento,
            'dataProviderChecklistEquipamento' => $dataProviderChecklistEquipamento,
            'searchModelChecklistHumana' => $searchModelChecklistHumana,
            'dataProviderChecklistHumana' => $dataProviderChecklistHumana,
            'contextoTemModulos' => $contextoTemModulos,
            'funcionamentoSis' => $funcionamentoSis,
            'funcionamentoSisInfo' => $funcionamentoSisInfo,
            'pareceresTecnicosVerticalIndicador' => $pareceresTecnicosVerticalIndicador,
            'planoAplicacaoSegmentos' => $planoAplicacaoSegmentos,
            'planoAplicacaoFull' => $planoAplicacaoFull,
            'planoAplicacaoBasic' => $planoAplicacaoBasic,
            'idPeseFull' => $idPeseFull,
            'idPeseBasic' => $idPeseBasic,
            'ocorrencia_id' => $ocorrencia_id,
            'clienteTemParametrosLabel' => $clienteTemParametrosLabel,
            'planosAcaoStatus' => $planosAcaoStatus,
            'planosAcaoQtdeAcaoProposta' => $planosAcaoQtdeAcaoProposta,
            'totalAcaoProposta' => $totalAcaoProposta,
            'listaColetasComparativo' => $listaColetasComparativo,
            'coletasPerfilDesempenhoComparativo' => $coletasPerfilDesempenhoComparativo,
            'listaColetasComparativoPostado' => $listaColetasComparativoPostado,
            'coletaIndicadoresComparativo' => $coletaIndicadoresComparativo,
            'listaColetaArray' => $listaColetaArray,
            'selectcoleta0' => $selectcoleta0,
            'ocorrenciasTodas' => $ocorrenciasTodas,
            'params' => \Yii::$app->request->getQueryString(),
            'searchModelApuracao' => $searchModelApuracao,
            'dataProviderApuracao' => $dataProviderApuracao,
        ]);

        // Utils::debug($contexto->tipoLicenca);
        //        return $this->render('lgpd', [
        //                    'aplicacao' => $aplicacao,
        //                    'model' => $contexto,
        //                    'parametrosLabel' => $parametrosLabel,
        //                    'coletaReferencia' => $coletaReferencia,
        //                    'totalColetas' => $totalColetas,
        //                    'valorGlobal' => $valorGlobal,
        //                    'coletaValores' => $coletaValores,
        //                    'coletaNomes' => $coletaNomes,
        //                    'coletasIdNome' => $coletasIdNome,
        //                    'percentual' => $percentual,
        //                    'evolucao' => $evolucao,
        //                    'totalIndicadores' => $totalIndicadores,
        //                    'totalIndicadoresDemandamAtencao' => $totalIndicadoresDemandamAtencao,
        //                    'verticalPeriodicidade' => $verticalPeriodicidade,
        //                    'coletaEstruturaPvfs' => $coletaEstruturaPvfs,
        //                    'parametrosContexto' => $parametrosContexto,
        //                    'coletaReferenciaIndicadores' => $coletaReferenciaIndicadores,
        //                    'coletaReferenciaIndicacoresComprometedor' => $coletaReferenciaIndicacoresComprometedor,
        //                    'percentualIndicadorComprometedor' => $percentualIndicadorComprometedor,
        //                    'coletaReferenciaListaIndicacoresComprometedor' => $coletaReferenciaListaIndicacoresComprometedor,
        //                    'coletaReferenciaIndicacoresMercado' => $coletaReferenciaIndicacoresMercado,
        //                    'percentualIndicadorMercado' => $percentualIndicadorMercado,
        //                    'coletaReferenciaListaIndicacoresMercado' => $coletaReferenciaListaIndicacoresMercado,
        //                    'coletaReferenciaIndicacoresExcelencia' => $coletaReferenciaIndicacoresExcelencia,
        //                    'percentualIndicadorExcelencia' => $percentualIndicadorExcelencia,
        //                    'coletaReferenciaListaIndicacoresExcelencia' => $coletaReferenciaListaIndicacoresExcelencia,
        //                    'verticeColetaReferencia' => $verticeColetaReferencia,
        //                    'minProjeto' => $minProjeto,
        //                    'maxProjeto' => $maxProjeto,
        //                    'responsaveis' => [],
        //                    'faixasPadrao' => $faixasPadrao,
        //                    'plots' => $plots,
        //                    'listaNomeIndicadores' => $listaNomeIndicadores,
        //                    'listaValoresIndicadores' => $listaValoresIndicadores,
        //                    'indicadorResponsavelOrdem' => [],
        //                    //   'timelines' => $timelines,
        //                    'pareceresTecnicos' => $pareceresTecnicos,
        //                    // 'recomendacoesSeguranca' => $recomendacoesSeguranca,
        //// 'prioridades' => $prioridades,
        //                    'anexos' => $anexos,
        //                    //  'fotos' => $fotos,
        //                    'contatos' => $contatos,
        //                    'docsExiste' => $docsExiste,
        ////                    'pesePlanoAplicacaoDashboard' => $pesePlanoAplicacaoDashboard,
        ////                    'pesePlanoAplicacaoFullModel' => $pesePlanoAplicacaoFullModel,
        ////                    'pesePlanoAplicacaoFull' => $pesePlanoAplicacaoFull,
        ////                    'pesePlanoAplicacaoBasicModel' => $pesePlanoAplicacaoBasicModel,
        ////                    'pesePlanoAplicacaoBasic' => $pesePlanoAplicacaoBasic,
        ////                    'planoAplicacaoSegmentos' => $planoAplicacaoSegmentos,
        ////                    'servicosContratados' => $servicosContratados,
        //                    'isCeon' => $isCeon,
        //                    'coletaApoio' => $coletaApoio,
        //                    'coletaApoioEstruturaPvf' => $coletaApoioEstruturaPvf,
        //                    'coletaApoioValorGlobal' => $coletaApoioValorGlobal,
        //                    'coletaApoioIndicacoresComprometedor' => $coletaApoioIndicacoresComprometedor,
        //                    'coletaApoioIndicacoresMercado' => $coletaApoioIndicacoresMercado,
        //                    'coletaApoioIndicacoresExcelencia' => $coletaApoioIndicacoresExcelencia,
        //                    'coletaApoiolistaValoresIndicadores' => $coletaApoiolistaValoresIndicadores,
        //                    'riscoCenario' => $riscoCenario,
        //                    'dadosVerticalIndicadorResponsavel' => $dadosVerticalIndicadorResponsavel,
        //                    'coletaplanoacao' => $coletaplanoacao,
        //                    'vertical_indicador_id' => $vertical_indicador_id,
        //                    'todosCenariosPontuacao' => $todosCenariosPontuacao,
        //                    'todosCenarios' => $todosCenarios,
        //                    'todosRiscos' => $todosRiscos,
        //                    'todosCenariosDrilldrown' => $todosCenariosDrilldrown,
        //                    'riscosCategorias' => $riscosCategorias,
        //                    'cores' => $cores,
        //                    'coresPadrao' => $coresPadrao,
        //                    'avisaPendencia' => $avisaPendencia,
        //                    'botoes' => $botoes,
        //                    'origem' => 'contexto',
        //                    'permiteEditar' => $permiteEditar,
        //                    'ultimasAtualizacoes' => $ultimasAtualizacoes,
        //                    'organograma' => $organograma,
        //                    'totalNotificacoes' => $totalNotificacoes,
        //                    'analisesRegulatoriasContexto' => $analisesRegulatoriasContexto,
        //                    'planoAcaos' => $planoAcaos,
        //                    'licenciado' => $licenciado,
        //                    'totalGB' => $totalGB,
        //                    'percentualDisco' => $percentualDisco,
        //                    'bgDisco' => $bgDisco,
        //                    'fluxoInventario' => $fluxoInventario,
        //                    'fluxoColeta' => $fluxoColeta,
        //                    'fluxoPlanoAcao' => $fluxoPlanoAcao,
        //                    'fluxoDocsAdequacao' => $fluxoDocsAdequacao,
        //                    'fluxoRisco' => $fluxoRisco,
        //        ]);
    }

    public function actionDadosAreaPreocupacao($pai, $coleta, $vertice, $destino, $id = null)
    {

        $retorno = [];

        $coleta = Coleta::findOne($coleta);

        if ($coleta) {
            $faixasPadrao = $coleta->faixasPadrao;
        } else {
            $faixasPadrao = [];
        }

        if ($coleta) {
            if (!$coleta->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");
            }
        }

        $faixasPadrao = [];
        $faixasPadrao[] = ["from" => -1000, "to" => 40, "color" => "var(--red-500)", "label" => "Comprometedor"];
        $faixasPadrao[] = ["from" => 40.01, "to" => 80, "color" => "var(--yellow-500)", "label" => "Mercado"];
        $faixasPadrao[] = ["from" => 80.01, "to" => 1000, "color" => "var(--green-500)", "Excelência"];


        $min = 0;
        $max = 0;
        foreach ($faixasPadrao as $key => $v) {
            if ($v["from"] < $min) {
                $min = $v["from"];
            }
            if ($v["to"] > $max) {
                $max = $v["to"];
            }
        }

        if ($vertice == 1) {

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

            if ($coletaEstrutura) {

                $pontuacao = $coletaEstrutura->pontuacao;

                $cor = 'rgba(38,105,154,0.9)';
                foreach ($faixasPadrao as $key => $v) {
                    if ($pontuacao >= (int) $v["from"] && $pontuacao < (int) $v["to"]) {
                        $cor = $v["color"];
                    }
                }

                if ($pontuacao >= $max) {
                    $cor = 'rgba(38,105,154,0.9)';
                }
                if ($pontuacao <= $min) {
                    $cor = 'rgba(224,90,90,0.9)';
                }


                if ($pontuacao >= $max) {
                    $cor = '#DF5353';
                }
                if ($pontuacao <= $min) {
                    $cor = '#089f50';
                }


                $data = [];

                $data[] = [
                    'id' => $coletaEstrutura->id,
                    'name' => 'Valor Global',
                    'y' => (int) $pontuacao,
                    'drilldown' => true,
                    'chave' => $coletaEstrutura->id,
                    'tipo' => 'estrutura',
                    'vertice' => 0,
                    'color' => $cor,
                    'pai' => $pai,
                ];

                $retorno = [
                    'name' => 'Pontuação',
                    'data' => $data,
                    'pointWidth' => 60,
                    //                    'borderRadiusTopLeft' => '20px',
                    //                    'borderRadiusTopRight' => '20px',
                    //                    'borderRadiusBottomLeft' => '20px',
                    //                    'borderRadiusBottomRight' => '20px',
                ];
            }
        } else {

            $coletaEstruturas = ColetaEstrutura::find()
                ->where([
                    'cod_pai' => $pai,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->asArray()
                ->all();

            $data = [];

            foreach ($coletaEstruturas as $coletaEstrutura) {

                $pontuacao = $coletaEstrutura['pontuacao'];

                $cor = 'rgba(38,105,154,0.9)';
                foreach ($faixasPadrao as $key => $v) {
                    if ($pontuacao >= (int) $v["from"] && $pontuacao < (int) $v["to"]) {
                        $cor = $v["color"];
                    }
                }

                if ($pontuacao >= $max) {
                    $cor = 'rgba(224,90,90,0.9)';
                }
                if ($pontuacao <= $min) {
                    $cor = 'rgba(38,105,154,0.9)';
                }


                if ($pontuacao >= $max) {
                    $cor = '#089f50';
                }
                if ($pontuacao <= $min) {
                    $cor = '#DF5353';
                }


                $data[] = [
                    'id' => $coletaEstrutura['id'],
                    'name' => $coletaEstrutura['nome'],
                    'y' => (int) $pontuacao,
                    'drilldown' => true,
                    'chave' => $coletaEstrutura['id'],
                    'tipo' => 'estrutura',
                    'vertice' => 0,
                    'color' => $cor,
                    'pai' => $pai,
                ];
            }

            if (!$coletaEstruturas) {
                $indicadores = ColetaIndicador::find()
                    ->where([
                        'estrutura_id' => $pai,
                        'status' => ColetaIndicador::ATIVO,
                    ])
                    ->asArray()
                    ->all();

                foreach ($indicadores as $indicador) {

                    $pontuacaoIndicador = (int) $indicador['pontuacao'] + 0;

                    $cor = '#089f50';
                    foreach ($faixasPadrao as $key => $v) {
                        if ($pontuacaoIndicador >= (int) $v["from"] && $pontuacaoIndicador < (int) $v["to"]) {
                            $cor = $v["color"];
                        }
                    }

                    $cor = 'rgba(38,105,154,0.9)';

                    if ($pontuacaoIndicador >= $max) {
                        $cor = 'rgba(224,90,90,0.9)';
                    }
                    if ($pontuacaoIndicador <= $min) {
                        $cor = 'rgba(38,105,154,0.9)';
                    }



                    foreach ($faixasPadrao as $key => $v) {
                        if ($pontuacaoIndicador >= (int) $v["from"] && $pontuacaoIndicador < (int) $v["to"]) {
                            $cor = $v["color"];
                        }
                    }


                    $data[] = [
                        'name' => $indicador['nome'],
                        'y' => (int) $pontuacaoIndicador,
                        'drilldown' => false,
                        'chave' => $indicador['id'],
                        'tipo' => 'indicador',
                        'vertice' => 0,
                        'color' => $cor,
                        'pai' => $pai,
                    ];
                }
            }


            if ($destino == 1) {
                $qtdeEstruturas = count($data);
                if ($qtdeEstruturas > 5) {
                    $tamanho = null;
                } else {
                    $tamanho = 60;
                }
            } else {
                $tamanho = null;
            }

            $retorno = [
                'name' => 'Pontuação',
                'data' => $data,
                'pai' => $pai,
            ];

            if ($tamanho) {
                $retorno['pointWidth'] = $tamanho;
            }
        }

        return json_encode($retorno);
    }

    public function actionPesquisaEstrutura($id)
    {
        $indicador = VerticalIndicador::find()
            ->joinwith(['estrutura'])
            ->select(['vertical_estrutura.nome as nome', 'vertical_indicador.estrutura_id as estrutura_id'])
            ->where([
                'vertical_indicador.id' => $id,
                'vertical_indicador.status' => VerticalIndicador::ATIVO,
                'vertical_estrutura.status' => VerticalEstrutura::ATIVO,
            ])
            ->one();

        if (!$indicador) {
            return 'Não encontrada (' . $id . ')';
        }

        $retorno = '';
        $pesquisa = $indicador['estrutura_id'];
        $espaco = '&nbsp;&nbsp;&nbsp;';
        $pai = true;
        $items = [];
        while ($pai) {

            $estrutura = VerticalEstrutura::find()
                ->where([
                    'id' => $pesquisa
                ])
                ->one();

            if ($estrutura) {
                $items[] = $estrutura->nome;
                $pesquisa = $estrutura->cod_pai;
            } else {
                $pai = false;
            }
        }

        $items = array_reverse($items);

        unset($items[0]);

        foreach ($items as $item) {
            $retorno .= $espaco . $item . '<br />';
            $espaco .= '&nbsp;&nbsp;&nbsp;';
        }

        return $retorno;
    }

    public function actionPesquisaDadosAbsoluto($contexto, $vertical, $vertical_indicador_id)
    {

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

        if (!$model) {
            return [];
        }

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


        $retorno = [];
        $categoria = [];
        $dados = [];

        $coletaAlternativas = ColetaAlternativa::find()
            ->select([
                'coleta.nome as nome',
                'coleta_alternativa.interpolacao_absoluto as temp',
            ])
            ->join('LEFT JOIN', 'coleta_indicador', 'coleta_indicador.id=coleta_alternativa.indicador_id')
            ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id=coleta_indicador.estrutura_id')
            ->join('LEFT JOIN', 'coleta', 'coleta.id=coleta_estrutura.coleta_id')
            ->where([
                'coleta_alternativa.selecionado' => ColetaAlternativa::SELECIONADO,
                'coleta_indicador.vertical_indicador_id' => $vertical_indicador_id,
                'coleta.vertical_id' => $vertical,
                'coleta.contexto_id' => $contexto,
                'coleta_alternativa.status' => ColetaAlternativa::ATIVO,
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                'coleta.status' => Coleta::ATIVO,
            ])
            ->orderBy('coleta.data_coleta ASC, coleta.id ASC')
            ->all();

        //  Utils::debug($coletaAlternativas);
        foreach ($coletaAlternativas as $coletaAlternativa) {
            $categoria[] = $coletaAlternativa['nome'];
            $valorExplode = explode(" ", $coletaAlternativa['temp']);
            $dados[] = str_replace(",", ".", str_replace(".", "", str_replace("%", "", $valorExplode[0])));
            // $dados[] = $coletaAlternativa['temp'];
        }

        $retorno[] = [
            'categoria' => $categoria,
            'dados' => $dados,
        ];

        return json_encode($retorno, JSON_NUMERIC_CHECK);
    }

    public function actionPesquisaAlternativa($coleta, $indicador_id)
    {
        //return $indicador_id;
        $coleta = Coleta::findOne($coleta);

        if ($coleta) {
            if (!$coleta->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");
            }
        }

        $faixasPadrao = $coleta->faixasPadrao;

        $coletaAlternativas = ColetaAlternativa::find()
            ->join('LEFT JOIN', 'coleta_indicador', 'coleta_indicador.id=coleta_alternativa.indicador_id')
            ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id=coleta_indicador.estrutura_id')
            ->where([
                'coleta_indicador.id' => $indicador_id,
                //    'coleta_indicador.vertical_indicador_id' => $vertical_indicador_id,
                'coleta_estrutura.coleta_id' => $coleta ? $coleta->id : null,
                'coleta_alternativa.status' => ColetaAlternativa::ATIVO,
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
            ])
            ->orderBy('coleta_alternativa.nivel_referencia DESC, coleta_alternativa.id ASC')
            ->all();

        $n = count($coletaAlternativas);

        $retorno = '<table class="mt-2 martinelli-table">';
        $retorno .= '<thead>
                        <tr style="line-height: 20px;">
                            <th class="eo-adjust">EO</th>                           
                            <th class="col-5">Descrição</th>
                            <th></th>
                        </tr>
                    </thead><tbody>';

        foreach ($coletaAlternativas as $coletaAlternativa) {

            $checkP = '';

            if ($coletaAlternativa->selecionado) {

                $corP = '#DF5353';
                foreach ($faixasPadrao as $key => $value) {
                    if ($coletaAlternativa->nivel_referencia >= $value["from"] && $coletaAlternativa->nivel_referencia <= $value["to"]) {
                        $corP = $value["color"];
                    }
                }



                $faixasPadrao = [];
                $faixasPadrao[] = ["from" => -1000, "to" => 20, "color" => "var(--red-500)", "label" => "Comprometedor"];
                $faixasPadrao[] = ["from" => 20, "to" => 80, "color" => "var(--yellow-500)", "label" => "Mercado"];
                $faixasPadrao[] = ["from" => 80, "to" => 1000, "color" => "var(--green-500)", "Excelência"];

                foreach ($faixasPadrao as $key => $v) {
                    if ((int) $coletaAlternativa->nivel_referencia >= $value["from"] && (int) $coletaAlternativa->nivel_referencia <= $value["to"]) {
                        $corP = $value["color"];
                    }
                }



                $checkP = '<i class="fas fa-check-circle adjust-margin-color" aria-hidden="true" style=" color:' . $corP . '; font-weight:900 !important;"></i>';
            }

            $alternativaNivelReferenciaBn = null;
            if ($coletaAlternativa->nivel_referencia_bn == 'N') {
                $alternativaNivelReferenciaBn = '<div class="d-none d-md-block"> Neutro </div> <div class="d-md-none"> N </div>';
            }
            if ($coletaAlternativa->nivel_referencia_bn == 'B') {
                $alternativaNivelReferenciaBn = '<div class="d-none d-md-block"> Bom </div> <div class="d-md-none"> B </div>';
            }

            $retorno .= '<tr style="border-bottom: solid 1px var(--gray-200);">';
            $retorno .= '<td class="n-style"> N' . ($n ?? '--') . '</td>';
            $retorno .= '<td class="col-7">' . ($coletaAlternativa->nome ?? '--') . '</td>';
            $retorno .= '<td>' . $checkP . '</td>';
            $retorno .= '</tr>';

            $n--;
            //<tr style="border-bottom: solid 1px lightgray;"><td class="n-style"> N5</td><td class="col-3  nivel-referencia-bn"><div class="d-none d-md-block"> Bom </div> <div class="d-md-none"> B </div></td><td><div class="d-none d-sm-block nivel-referencia text-center">100</div></td><td class="col-7">50% dos processos licitatórios extrapolaram o prazo máximo de tramitação</td><td></td></tr><tr style="border-bottom: solid 1px lightgray;"><td class="n-style"> N4</td><td class="col-3  nivel-referencia-bn"></td><td><div class="d-none d-sm-block nivel-referencia text-center">33</div></td><td class="col-7">70% dos processos licitatórios extrapolaram o prazo máximo de tramitação</td><td></td></tr><tr style="border-bottom: solid 1px lightgray;"><td class="n-style"> N3</td><td class="col-3  nivel-referencia-bn"></td><td><div class="d-none d-sm-block nivel-referencia text-center">20</div></td><td class="col-7">77,5% dos processos licitatórios extrapolaram o prazo máximo de tramitação</td><td><i class="fa fa-2x fa-check-circle adjust-margin-color" aria-hidden="true" style=" color:#e8dd11"></i></td></tr><tr style="border-bottom: solid 1px lightgray;"><td class="n-style"> N2</td><td class="col-3  nivel-referencia-bn"><div class="d-none d-md-block"> Neutro </div> <div class="d-md-none"> N </div></td><td><div class="d-none d-sm-block nivel-referencia text-center">0</div></td><td class="col-7">90% dos processos licitatórios extrapolaram o prazo máximo de tramitação</td><td></td></tr><tr style="border-bottom: solid 1px lightgray;"><td class="n-style"> N1</td><td class="col-3  nivel-referencia-bn"></td><td><div class="d-none d-sm-block nivel-referencia text-center">-33</div></td><td class="col-7">100% dos processos licitatórios extrapolaram o prazo máximo de tramitação</td><td></td></tr></tbody></table>';
        }

        return $retorno;
    }

    public function actionPesquisaParametro($vertical_indicador_id)
    {

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

        if (!$parametrosPadrao) {
            $parametros = 'Nenhum parâmetro cadastrado<br />';
        } else {
            $parametros = '';
            $parametros .= '<table id="tableparametro" style="width: 100%; border: 1px solid lightgray;">';
            foreach ($parametrosPadrao as $pPadrao) {
                $parametros .= '<tr style="border: 1px solid lightgray;"><td style="width:30%; border: 1px solid lightgray; padding: 10px;">' . $pPadrao->parametro . '</td><td style="border: 1px solid lightgray; padding: 10px;">' . $pPadrao->valor . '</td></tr>';
            }
            $parametros .= '</table>';
        }

        return $parametros;
    }

    public function actionPesquisaGpp($vertical_indicador_id)
    {

        $dadosGpp = [];

        $gppCausaProvaveis = GppCausaProvavel::find()->all();

        foreach ($gppCausaProvaveis as $gppCausaProvavel) {

            $acoes = [];

            $acoesPropostas = GppAcaoProposta::find()
                ->where([
                    'indicador_id' => $gppCausaProvavel->vertical_indicador_id,
                    'causa_provavel_id' => $gppCausaProvavel->id,
                ])
                ->all();
            foreach ($acoesPropostas as $acoesProposta) {
                $acoes[] = [
                    'id' => $acoesProposta->id,
                    'acao_proposta' => $acoesProposta->acao_proposta,
                    'inativo' => $acoesProposta->inativo,
                    'inicio' => $acoesProposta->inicio,
                    'termino_previsto' => $acoesProposta->termino_previsto,
                    'termino_realizado' => $acoesProposta->termino_realizado,
                    'situacao' => $acoesProposta->situacao,
                ];
            }

            $dadosGpp[$gppCausaProvavel->vertical_indicador_id][] = [
                'causa_provavel' => $gppCausaProvavel->causa_provavel,
                'acoes' => $acoes,
            ];
        }
        if (isset($dadosGpp[$vertical_indicador_id])) {
            $dadosGpp = $dadosGpp[$vertical_indicador_id];
        } else {
            $dadosGpp = [];
        }

        // Utils::debug($dadosGpp);

        $retorno = '';
        $retorno .= 'Estratificação:<br /><br />';
        $retorno .= '<div class="accordion" id="accordionExample">';

        $num = 1;
        for ($i = 0; $i < count($dadosGpp); $i++) {

            $retorno .= '   <div class="">';
            $retorno .= '       <div class="" id="heading' . $i . '">';
            $retorno .= '           <h4 class="mb-0">';
            $retorno .= '               <a href="javascript:void(0)" class="text-left" style="color: slategray;" data-toggle="collapse" data-target="#collapse' . $i . '" aria-expanded="true" aria-controls="collapse' . $i . '">';
            $retorno .= '                   <b>' . $num . ') ' . $dadosGpp[$i]['causa_provavel'] . '</b>';
            $retorno .= '               </a>';
            $retorno .= '           </h4>';
            $retorno .= '       </div>';
            $retorno .= '       <div id="collapse' . $i . '" class="collapse" aria-labelledby="heading' . $i . '" data-parent="#accordionExample">';
            $retorno .= '           <div class="card-body" style="background: white">';

            $acoesGppArray = $dadosGpp[$i]['acoes'];
            $acoesGppLength = count($acoesGppArray);
            $numacao = 1;

            $retorno .= '<table width="100%" style="color:black; border-collapse: collapse;border: solid 1px black;border-left: none;border-right: none;">';
            $retorno .= '<tr style="font-weight:bold;text-align:center; border-collapse: collapse;border: solid 1px black;border-left: none;border-right: none;">';
            $retorno .= '<td style="padding: 5px; width:50%">Ação</td>';
            $retorno .= '<td style="padding: 5px;">Início<br />Previsto</td>';
            $retorno .= '<td style="padding: 5px;">Término<br />Previsto</td>';
            $retorno .= '<td style="padding: 5px;">Término<br />Realizado</td>';
            $retorno .= '<td style="padding: 5px;">Situação</td>';
            $retorno .= '</tr>';

            $back = 'white';
            for ($j = 0; $j < $acoesGppLength; $j++) {
                if ($back == 'white') {
                    $back = 'lightgray';
                } else {
                    $back = 'white';
                }
                $dInicio = date('d/m/Y', strtotime($acoesGppArray[$j]['inicio']));
                $dPrevisto = date('d/m/Y', strtotime($acoesGppArray[$j]['termino_previsto']));
                $dRealizado = date('d/m/Y', strtotime($acoesGppArray[$j]['termino_realizado']));

                $retorno .= '<tr style="background: ' . $back . '; border-collapse: collapse;border: solid 1px black;border-left: none;border-right: none;">';
                $retorno .= '<td style="padding: 5px;">' . $acoesGppArray[$j]['acao_proposta'] . '</td>';
                $retorno .= '<td style="padding: 5px;" >' . $dInicio . '</td>';
                $retorno .= '<td style="padding: 5px;" >' . $dPrevisto . '</td>';
                $retorno .= '<td style="padding: 5px;" >' . $dRealizado . '</td>';
                $retorno .= '<td style="padding: 5px;" >' . $acoesGppArray[$j]['situacao'] . '</td>';
                $retorno .= '</tr>';
            }
            $retorno .= '</table><br /><br />';
            $retorno .= '   </div>';
            $retorno .= '  </div>';
            $retorno .= '</div>';
            $retorno .= '<br />';
            $num++;
        }

        return $retorno;
    }

    public function actionPesquisaPlanoAcao($contexto_id, $aplicacao_id, $coleta_id, $vertical_indicador_id)
    {

        $retorno = '';

        $contexto = Contexto::find()
            ->where([
                'id' => $contexto_id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

        if (!$contexto) {
            return 'Cliente não encontrado';
        }

        if (!$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");
        }

        if (!Logged::isCeon()) {

            $meusContextos = GenericSearch::filterMyContextosVisualizacao()->query->select('contexto.id')->column();

            if ($contexto_id) {
                if (in_array($contexto_id, $meusContextos)) {

                    if ($contexto->tipoLicenca == 'Licenciado') {
                        $retorno .= '<div class="row mb-3"><div class="col-12 text-right"><a id="novo-plano-acao-em-offcanvas" href=javascript:void(0) class="martinelli-button" data-url="/performance/plano-acao/create?contexto_id=' . $contexto_id . '&aplicacao_id=' . $aplicacao_id . '&coleta_id=' . $coleta_id . '&vertical_indicador_id=' . $vertical_indicador_id . '&layout=contexto" ><i class="fa fa-plus-circle"></i> Novo plano de ação</a></div></div>';
                    }
                }
            }
        } else {
            $retorno .= '<div class="row mb-3"><div class="col-12 text-right"><a id="novo-plano-acao-em-offcanvas" href=javascript:void(0) class="martinelli-button" data-url="/performance/plano-acao/create?contexto_id=' . $contexto_id . '&aplicacao_id=' . $aplicacao_id . '&coleta_id=' . $coleta_id . '&vertical_indicador_id=' . $vertical_indicador_id . '&layout=contexto" ><i class="fa fa-plus-circle"></i> Novo plano de ação</a></div></div>';
        }

        $planoAcaos = PlanoAcao::find()
            ->joinWith(['paPlanoAcaoTemIndicadors'])
            ->where([
                'pa_plano_acao_tem_indicador.vertical_indicador_id' => $vertical_indicador_id,
                'pa_plano_acao.contexto_id' => $contexto_id,
            ])
            ->andWhere(['!=', 'pa_plano_acao.status', PlanoAcao::INATIVO])
            ->all();

        if (!$planoAcaos) {
            $retorno .= 'Nenhum Plano de Ação cadastrado.';
            return $this->renderAjax('_nenhum_plano_de_acao', [
                'contexto_id' => $contexto_id,
                'aplicacao_id' => $aplicacao_id,
                'coleta_id' => $coleta_id,
                'vertical_indicador_id' => $vertical_indicador_id,
            ]);
        }

        return $this->renderAjax('_plano_acao3', [
            'planoAcaos' => $planoAcaos,
            'retorno' => $retorno,
            'contexto_id' => $contexto_id,
            'aplicacao_id' => $aplicacao_id,
            'coleta_id' => $coleta_id,
            'vertical_indicador_id' => $vertical_indicador_id,
        ]);
    }

    public function actionPesquisaSparkline($projeto, $vertical, $vertical_indicador_id)
    {

        $coletaAlternativas = ColetaAlternativa::find()
            ->select('nivel_referencia')
            ->join('LEFT JOIN', 'coleta_indicador', 'coleta_indicador.id = coleta_alternativa.indicador_id')
            ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id = coleta_indicador.estrutura_id')
            ->join('LEFT JOIN', 'coleta', 'coleta.id = coleta_estrutura.coleta_id')
            ->where([
                'coleta_alternativa.selecionado' => ColetaAlternativa::SELECIONADO,
                'coleta_indicador.vertical_indicador_id' => $vertical_indicador_id,
                'coleta.projeto_id' => $projeto,
                'coleta.vertical_id' => $vertical,
                'coleta_alternativa.status' => ColetaAlternativa::ATIVO,
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                'coleta.status' => Coleta::ATIVO,
            ])
            ->orderBy('coleta.data_coleta ASC, coleta.id ASC')
            ->column();

        return implode(",", $coletaAlternativas);
    }

    public function actionRecuperaColetaPvf($coleta)
    {

        $coletaModel = Coleta::findOne($coleta);

        if (!$coletaModel) {
            return [];
        }

        if (!$coletaModel->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");
        }

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

        $estruturas = ColetaEstrutura::find()
            ->where([
                'coleta_id' => $coleta,
                'cod_pai' => $vertice ? $vertice->id : null,
                'status' => ColetaEstrutura::ATIVO,
            ])
            ->all();

        $listaEstruturas = [];
        foreach ($estruturas as $estrutura) {
            //            if ($estrutura->pontuacao) {
            //                 $tx = "(<b>" . $estrutura->taxa_substituicao . "% | " . str_replace('.', ', ', $estrutura->pontuacao) . " pts</b>) ";
            //            } else {
            //                $tx = "(<b>" . $estrutura->taxa_substituicao . "% | " . $estrutura->pontuacao . " pts</b>) ";
            //            }

            $dados[] = [
                'id' => $estrutura->id,
                'text' => $estrutura->nome,
                'children' => true,
                'data' => [
                    'tipo' => 'estrutura',
                ],
            ];
        }

        $indicadores = ColetaIndicador::find()
            ->where([
                'status' => ColetaIndicador::ATIVO,
            ])
            ->andWhere(['in', 'estrutura_id', $listaEstruturas])
            ->all();

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

            $dados[] = [
                'id' => 'I' . $indicador->id,
                'parent_id' => $indicador->estrutura_id,
                'text' => $indicador->nome,
                'children' => false,
                'icone' => 'fas fa-sort-numeric-down',
                'data' => [
                    'tipo' => 'indicador',
                ],
            ];

            $listaIndicadores[] = $indicador->id;
        }

        $alternativas = ColetaAlternativa::find()
            ->where([
                'status' => ColetaAlternativa::ATIVO,
            ])
            ->andWhere(['in', 'indicador_id', $listaIndicadores])
            ->orderBy('nivel_referencia DESC, ordem ASC')
            ->all();

        foreach ($alternativas as $alternativa) {

            $dados[] = [
                'id' => 'A' . $alternativa->id,
                'parent_id' => 'I' . $alternativa->indicador_id,
                'text' => $alternativa->nome,
                'children' => false,
                'icone' => false,
            ];
        }

        //Utils::debug($dados);
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

        return $dados;
    }

    public function actionRecuperaColetaFilho($id, $tipo)
    {

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

        $dados = [];

        if ($tipo == 'estrutura') {

            $estruturas = ColetaEstrutura::find()
                ->where([
                    'cod_pai' => $id,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->all();

            foreach ($estruturas as $estrutura) {

                $dados[] = [
                    'id' => $estrutura->id,
                    'text' => $estrutura->nome,
                    'children' => true,
                    'data' => [
                        'tipo' => 'estrutura',
                    ],
                ];
            }

            if (!$estruturas) {

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

                $listaIndicadores = [];

                foreach ($indicadores as $indicador) {

                    $dados[] = [
                        'id' => 'I' . $indicador->id,
                        'parent_id' => $indicador->estrutura_id,
                        'text' => $indicador->nome,
                        'children' => true,
                        'icon' => 'fas fa-sort-numeric-down',
                        'data' => [
                            'tipo' => 'indicador',
                        ],
                    ];
                }
            }
        }

        if ($tipo == 'indicador') {

            $indicadorBase = substr($id, 1);

            $alternativas = ColetaAlternativa::find()
                ->where([
                    'indicador_id' => $indicadorBase,
                    'status' => ColetaAlternativa::ATIVO,
                ])
                ->orderBy('nivel_referencia DESC, ordem ASC')
                ->all();

            $coletaReferencia = Coleta::find()
                ->join('LEFT JOIN', 'coleta_estrutura', 'coleta.id = coleta_estrutura.coleta_id')
                ->join('LEFT JOIN', 'coleta_indicador', 'coleta_estrutura.id = coleta_indicador.estrutura_id')
                ->where([
                    'coleta_indicador.id' => $indicadorBase,
                    'coleta.status' => Coleta::ATIVO,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO,
                ])
                ->one();

            if ($coletaReferencia) {
                foreach ($alternativas as $alternativa) {

                    if ($alternativa->nivel_referencia == 100) {
                        $bno = 'B';
                    } elseif ($alternativa->nivel_referencia == 0) {
                        $bno = 'N';
                    } else {
                        $bno = '&nbsp;
                            ';
                    }

                    $selecionado = '&nbsp;
                            ';
                    if ($alternativa->selecionado == ColetaAlternativa::SELECIONADO) {

                        if ($coletaReferencia) {
                            $faixasPadrao = $coletaReferencia->faixasPadrao;

                            $corP = '#DF5353';
                            foreach ($faixasPadrao as $key => $value) {
                                if ($alternativa->nivel_referencia >= $value["from"] && $alternativa->nivel_referencia <= $value["to"]) {
                                    $corP = $value["color"];
                                }
                            }
                        }
                        $selecionado = '<i class="fa fa-check-circle" aria-hidden="true" style="margin-top: -7px; color:' . $corP . '"></i>';
                    }


                    $text = "";
                    $text .= "<div style='width:100%;'>";
                    $text .= "<div style='width:18px; min-width:18px; position:relative; float: left;margin-left: 5px;font-weight:bold;'> " . $bno . "</div>";
                    $text .= "<div style='width:22px; min-width:22px; position:relative; float: left'>" . $selecionado . "</div>";
                    $text .= "<div style='position:relative; float:left;'>" . $alternativa->nome . "</div>";
                    $text .= "</div>";

                    $dados[] = [
                        'id' => 'A' . $alternativa->id,
                        'parent_id' => 'I' . $alternativa->indicador_id,
                        'text' => $text,
                        'icon' => false,
                        'data' => [
                            'tipo' => 'alternativa',
                        ],
                    ];
                }
            }
        }

        return $dados;
    }

    public function actionUpdate($id, $aplicacao_id = 7, $destino = 'index')
    {

        \app\models\Base::loga("Acessou a atualização de Contexto", $_GET, $_POST, 49, $id);

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

        $contexto = Contexto::find()
            ->where([
                'id' => $id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

        if (!$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::filterMyContextosAnaliseTecnica()
            ->query
            ->select('contexto.id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'contexto.id', $id])
            ->column();

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


        // $advogado = ArrayHelper::map(\app\models\User::find()
        //     ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
        //     ->where([
        //         'profile.cliente_id' => $contexto->cliente_id,
        //         'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
        //     ])
        //     ->all(), 'id', 'name');

        $userAdvogado = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
            ->where([
                //    'profile.cliente_id' => $contexto->cliente_id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->all(), 'id', 'name');

        $userResponsavel = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere(['=', 'user_has_resource.role', UserHasResource::NV_CP_CLIENTE_ADM])
            ->andWhere(['=', 'user_has_resource.resource_id', $contexto->cliente_id])
            ->all(), 'id', 'name');


        $userAdmin =  ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'auth_assignment', 'user_ceon.id=auth_assignment.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere([
                'OR',
                ['=', 'auth_assignment.item_name', 'Admin'],
                ['=', 'auth_assignment.item_name', 'Admininistrador'],
            ])
            ->all(), 'id', 'name');

        $advogado = array_replace_recursive($userAdvogado, $userResponsavel, $userAdmin);
        // \app\components\Utils::debug([$userAdvogado, $userResponsavel, $userAdmin, $advogado]);


        $contexto->lgpdAdvogado = User::find()
            ->select('user_ceon.id as id')
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'user_has_resource.role' => UserHasResource::NV_CP_CONTEXTO_ADM,
                'user_has_resource.resource_id' => $id,
                'user_ceon.status' => User::STATUS_ACTIVE,
            ])
            ->column();


        $advogadoExiste = $contexto->lgpdAdvogado;

        //        $advogado = ArrayHelper::map(User::find()
        //                                ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
        //                                ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
        //                                ->where([
        //                                    'user_has_resource.role' => UserHasResource::NV_CP_CONTEXTO_ADM,
        //                                    'user_has_resource.resource_id' => $id,
        //                                    'user_ceon.status' => User::STATUS_ACTIVE,
        //                                ])
        //                                ->all(), 'id', 'name');

        $usuarios = User::find()
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'user_has_resource.role' => UserHasResource::NV_CP_CONTEXTO_VIEW,
                'user_has_resource.resource_id' => $id,
                'user_ceon.status' => User::STATUS_ACTIVE,
            ])
            ->all();

        $quantidadeUsuarios = count($usuarios);

        if (!$usuarios) {
            $usuarios = [new \app\models\User()];
        }

        $msgErro = '';

        $verticais = [];
        $verticaisAtivas = Vertical::find()->where(['status' => Vertical::ATIVO])->all();
        foreach ($verticaisAtivas as $k => $verticaisAtiva) {
            $verticais[$verticaisAtiva->id] = $verticaisAtiva->nome;
        }

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

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

        $projeto->projetoCodigoPosColetaOriginal = $projeto->codigo_pos_coleta;

        foreach (Projeto::CONNECTORS as $c => $l) {
            if ($projeto->codigo_pos_coleta == $l) {
                $projeto->codigo_pos_coleta = $c;
                break;
            }
        }

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

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

        $connectors = Projeto::CONNECTORS;

        $contextoTemModeloRisco = ContextoTemModeloRisco::find()->where(['contexto_id' => $contexto->id])->one();

        if (!$contextoTemModeloRisco) {
            $contextoTemModeloRisco = new ContextoTemModeloRisco();
        }

        $riscosModelosLista = [];
        $riscoModelos =  RiscoModelo::find()
            ->where([
                'status' => RiscoModelo::ATIVO,
            ])
            ->all();
        foreach ($riscoModelos as $riscoModelo) {
            if ($riscoModelo->verticalVinculo->status == Vertical::ATIVO) {
                $riscosModelosLista[$riscoModelo->id] = $riscoModelo->nome;
            }
        }

        $licenca = Licenca::find()->where(['contexto_id' => $contexto->id])->one();

        if (!$licenca) {
            throw new HttpException(500, "Licença não encontrada");
        }

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

            $transaction = Yii::$app->db->beginTransaction();

            try {
                $valid = true;

                $contexto->logoFile = UploadedFile::getInstance($contexto, 'logoFile');

                if ($contexto->logoFile) {

                    $contexto->foto = md5(date('Ymd') . $contexto->logoFile->name) . '.' . $contexto->logoFile->extension;

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

                $contexto->endereco = '';
                if (!$contexto->save()) {
                    $valid = false;
                    throw new HttpException(500, '1 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                }


                $contextoTemModeloRisco->load(Yii::$app->request->post());
                $contextoTemModeloRisco->contexto_id = $contexto->id;
                if (!$contextoTemModeloRisco->save()) {
                    throw new HttpException(500, '5a - Erro ao salvar o Modelo de Risco, motivo: ' . json_encode($contextoTemModeloRisco->getErrors()));
                }

                if ($valid) {

                    //remover contexto adm de todos os adv
                    //remover user has resource todos adv
                    //para cada adv post add contexto adm
                    //para cada adv adc user_has_resourec

                    foreach ($advogadoExiste as $key) {

                        $removerRoles = [UserHasResource::NV_CP_CONTEXTO_ADM, UserHasResource::NV_CO_OPERADOR];

                        foreach ($removerRoles as $removerRole) {
                            $recursoAdv = UserHasResource::find()
                                ->where([
                                    'user_id' => $key,
                                    'role' => $removerRole,
                                    'resource_id' => $contexto->id
                                ])
                                ->one();

                            if ($recursoAdv) {
                                if (!$recursoAdv->delete()) {
                                    $valid = false;
                                    throw new HttpException(500, '3 - Erro ao remover o Advogado existente, motivo: ' . json_encode($recursoAdv->getErrors()));
                                }
                            }
                        }
                    }

                    if ($contexto->lgpdAdvogado) {

                        foreach ($contexto->lgpdAdvogado as $novoAdvogado) {

                            $rolesNovoAdvogado = array_keys(\Yii::$app->authManager->getRolesByUser($novoAdvogado));
                            if (!in_array(UserHasResource::NV_CP_CONTEXTO_ADM, $rolesNovoAdvogado)) {
                                $authManager = Yii::$app->authManager;
                                $authManager->assign($authManager->getRole(UserHasResource::NV_CP_CONTEXTO_ADM), $novoAdvogado);
                            }

                            if (!in_array(UserHasResource::NV_CR_CLIENTE_GESTOR, $rolesNovoAdvogado)) {
                                $authManager = Yii::$app->authManager;
                                $authManager->assign($authManager->getRole(UserHasResource::NV_CR_CLIENTE_GESTOR), $novoAdvogado);
                            }

                            if (!in_array(UserHasResource::NV_CO_OPERADOR, $rolesNovoAdvogado)) {
                                $authManager = Yii::$app->authManager;
                                $authManager->assign($authManager->getRole(UserHasResource::NV_CO_OPERADOR), $novoAdvogado);
                            }

                            $userHasResource = new UserHasResource();
                            $userHasResource->user_id = $novoAdvogado;
                            $userHasResource->role = UserHasResource::NV_CP_CONTEXTO_ADM;
                            $userHasResource->resource_id = (string) $contexto->id;
                            $userHasResource->param = 'role';
                            $userHasResource->value = 'Administrador';
                            if (!$userHasResource->save()) {
                                $valid = false;
                                throw new HttpException(500, '2- Erro ao adicionar o Advogado, motivo: ' . json_encode($userHasResource->getErrors()));
                            }

                            $novoAdvogadoTemRisco = UserHasResource::find()
                                ->where([
                                    'user_id' => $novoAdvogado,
                                    'role' => UserHasResource::NV_CR_CLIENTE_GESTOR,
                                    'resource_id' => $contexto->cliente_id,
                                ])
                                ->one();

                            if (!$novoAdvogadoTemRisco) {
                                $userHasResourceRisco = new UserHasResource();
                                $userHasResourceRisco->user_id = $novoAdvogado;
                                $userHasResourceRisco->role = UserHasResource::NV_CR_CLIENTE_GESTOR;
                                $userHasResourceRisco->resource_id = (string) $contexto->cliente_id;
                                $userHasResourceRisco->param = 'role';
                                $userHasResourceRisco->value = 'Administrador';
                                if (!$userHasResourceRisco->save()) {
                                    $valid = false;
                                    throw new HttpException(500, '2- Erro ao adicionar o Advogado, motivo: ' . json_encode($userHasResourceRisco->getErrors()));
                                }
                            }

                            // $userHasResource = new UserHasResource();
                            // $userHasResource->user_id = $novoAdvogado;
                            // $userHasResource->role = UserHasResource::NV_CO_OPERADOR;
                            // $userHasResource->resource_id = $contexto->id;
                            // $userHasResource->param = 'role';
                            // $userHasResource->value = 'Visualizador';
                            // if (!$userHasResource->save()) {
                            //     $valid = false;
                            //     $msgErro .= '2- Erro ao adicionar o Advogado, motivo: ' . json_encode($userHasResource->getErrors());
                            // }
                        }
                    }

                    $projeto->codigo_pos_coleta = $projeto->projetoCodigoPosColetaOriginal;

                    $projeto->load(Yii::$app->request->post());

                    // $connectors = [];
                    // $connectors[1] = '\app\modules\performance\models\Coleta::webConnectorInventarioDadosLaudoSeguranca($coleta);';

                    if (isset($connectors[$projeto->codigo_pos_coleta])) {
                        $projeto->codigo_pos_coleta = (string) $connectors[$projeto->codigo_pos_coleta];
                    } else {
                        $projeto->codigo_pos_coleta = null;
                    }

                    $projeto->contextos = $projeto->contextos . ',' . $contexto->id;
                    if (!$projeto->save()) {
                        throw new HttpException(500, '5 - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors()));
                    }

                    $projetoTemVertical->load(Yii::$app->request->post());

                    if (!$projetoTemVertical->save()) {
                        throw new HttpException(500, "7 - Erro ao salvar a vertical no projeto, motivo: " . json_encode($projetoTemVertical->getErrors()));
                    }
                }

                if ($valid) {

                    $usuariosExiste = [];
                    foreach ($usuarios as $usuario) {
                        $usuariosExiste[] = $usuario->username;
                    }

                    $usuariosInserir = [];
                    if (isset($_POST['User'])) {
                        foreach ($_POST['User'] as $key => $row) {
                            $usernamenumber = str_replace("-", "", str_replace(".", "", $row['username']));
                            $usuariosInserir[] = $usernamenumber;
                        }
                    }

                    //excluir
                    foreach ($usuarios as $usuario) {

                        if ($valid) {
                            if (!in_array($usuario->username, $usuariosInserir)) {

                                User::excluirVisualizador($usuario->id, $contexto->id);
                                /* $usuarioExcluir = UserHasResource::find()
                                    ->where([
                                        'user_id' => $usuario->id,
                                        'role' => UserHasResource::NV_CP_CONTEXTO_VIEW,
                                        'resource_id' => $contexto->id
                                    ])
                                    ->one();

                                if ($usuarioExcluir) {
                                    $valid = $usuarioExcluir->delete();
                                    $msgErro .= '6 - Erro ao excluir acesso do Cliente, motivo: ' . json_encode($usuarioExcluir->getErrors());
                                } */
                            }
                        }
                    }
                    //inserir

                    if (isset($_POST['User'])) {
                        foreach ($_POST['User'] as $key => $row) {

                            if ($valid) {
                                $string = 'MarL31@' . Yii::$app->security->generateRandomString(6);
                                $usernamenumber = str_replace("-", "", str_replace(".", "", $row['username']));
                                if (!in_array($usernamenumber, $usuariosExiste)) {

                                    $usuarioJaCadastrado = false;
                                    $enviaEmail = false;

                                    if (isset($row['username'])) {
                                        $usuarioJaCadastrado = User::findOne(['username' => str_replace("-", "", str_replace(".", "", $row['username']))]);
                                    }

                                    if ($usuarioJaCadastrado) {
                                        $acesso = $usuarioJaCadastrado;
                                    } else {

                                        $enviaEmail = true;
                                        $acesso = new User();
                                        $acesso->username = $row['username'];
                                        $acesso->name = $row['name'];
                                        $acesso->email = $row['email'];
                                        $acesso->organization = $contexto->name;
                                        $acesso->password_raw = $string;
                                        $acesso->password_confirm = $string;
                                        $acesso->setPassword($acesso->password_raw);
                                        $acesso->generateAuthKey();

                                        if (!$acesso->save()) {
                                            $valid = false;
                                            throw new HttpException(500, '7 - Erro ao criar usuário de acesso do Cliente, motivo: ' . json_encode($acesso->getErrors()));
                                        }

                                        if ($valid) {
                                            $profileAcesso = new \app\models\Profile();
                                            $profileAcesso->user_id = $acesso->id;
                                            $profileAcesso->address = '...';
                                            $profileAcesso->city = '...';
                                            $profileAcesso->contact = '...';
                                            $profileAcesso->cliente_id = $contexto->cliente_id;

                                            if (!$profileAcesso->save()) {
                                                $valid = false;
                                                throw new HttpException(500, '8 - Erro ao criar o Profile do usuário de acesso do Cliente, motivo: ' . json_encode($profileAcesso->getErrors()));
                                            }
                                        }
                                    }


                                    if ($valid) {

                                        $authManager = Yii::$app->authManager;

                                        $roles = array_keys(\Yii::$app->authManager->getRolesByUser($acesso->id));

                                        if (!in_array(UserHasResource::NV_CP_CONTEXTO_VIEW, $roles)) {
                                            $authManager->assign($authManager->getRole(UserHasResource::NV_CP_CONTEXTO_VIEW), $acesso->id);
                                        }

                                        if (!in_array('Básico', $roles)) {
                                            $authManager->assign($authManager->getRole('Básico'), $acesso->id);
                                        }
                                    }

                                    if ($valid) {
                                        $userHasResourceAcesso = new UserHasResource();
                                        $userHasResourceAcesso->user_id = $acesso->id;
                                        $userHasResourceAcesso->role = UserHasResource::NV_CP_CONTEXTO_VIEW;
                                        $userHasResourceAcesso->resource_id = (string) $contexto->id ?? '';
                                        $userHasResourceAcesso->param = 'role';
                                        $userHasResourceAcesso->value = 'Administrador';
                                        if (!$userHasResourceAcesso->save()) {
                                            $valid = false;
                                            $msgErro .= '9 - Erro ao criar o acesso do Cliente, motivo: ' . json_encode($userHasResourceAcesso->getErrors());
                                        }
                                    }

                                    if ($valid) {
                                        if ($enviaEmail) {

                                            $dados = [];
                                            $dados['user'] = $acesso;
                                            $dados['profile'] = $acesso->profile;
                                            $dados['contexto'] = $contexto;
                                            $dados['string'] = $string;

                                            EmailTemplate::enviaEmail(EmailTemplate::TIPO_VISUALIZADOR_CONTEXTO, $dados, $acesso->email, 'Bem-vindo(a) ' . getenv('NOME_PLATAFORMA'));

                                            // Yii::$app->mailer->compose('_usuario', [
                                            //     'user' => $acesso,
                                            //     'string' => $string,
                                            //     'contexto' => $contexto,
                                            // ])
                                            //     ->setFrom('no-reply@krinom.com.br')
                                            //     ->setReplyTo(getenv('EMAIL_CONTATO'))
                                            //     ->setTo($acesso->email)
                                            //     ->setBcc(['gledson@krinom.com.br'])
                                            //     ->setSubject('Bem-vindo ' . getenv('NOME_PLATAFORMA'))
                                            //     ->send();
                                        }
                                    }
                                }
                            }
                        }
                    }

                    //atualizar
                    if (isset($_POST['User'])) {
                        foreach ($_POST['User'] as $key => $row) {
                            if ($valid) {
                                $usernamenumber = str_replace("-", "", str_replace(".", "", $row['username']));
                                if (in_array($usernamenumber, $usuariosExiste)) {
                                    foreach ($usuarios as $usuario) {
                                        if ($valid) {
                                            if ($usuario->username == $usernamenumber) {
                                                $usuario->name = $row['name'];
                                                $usuario->email = $row['email'];
                                                if (!$usuario->save()) {
                                                    $valid = false;
                                                    throw new HttpException(500, '10 - Erro ao atualizar os dados do usuário do Cliente, motivo: ' . json_encode($usuario->getErrors()));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if ($valid) {

                    $scope = \app\models\Scope::find()
                        ->where([
                            'contexto_id' => $contexto->id,
                            'status' => \app\models\Scope::ATIVO,
                        ])
                        ->andWhere(['is', 'parent_id', new \yii\db\Expression('null')])
                        ->one();

                    if ($scope) {
                        $scope->name = $contexto->name;
                        if (!$scope->save()) {
                            $valid = false;
                            throw new HttpException(500, '11 - Erro ao atualizar os dados do inventário de dados do Cliente, motivo: ' . json_encode($scope->getErrors()));
                        }
                    }
                }

                if ($valid) {
                    // Utils::debug($contexto->modulos);

                    ContextoTemModulo::deleteAll(['contexto_id' => $contexto->id]);

                    foreach ($contexto->modulos as $modulo) {
                        $contextoTemModulo = new ContextoTemModulo();
                        $contextoTemModulo->contexto_id = $contexto->id;
                        $contextoTemModulo->modulo = $modulo;

                        if (!$contextoTemModulo->save()) {
                            $valid = false;
                            foreach ($contextoTemModulo->getErrors() as $key => $value) {
                                foreach ($value as $chave => $erro) {
                                    $msgErro .= $erro . '<br />';
                                }
                            }
                            throw new HttpException(500, $msgErro);
                        }
                    }
                }

                $licenca->load(Yii::$app->request->post());

                if (!$licenca->save()) {
                    throw new HttpException(500, "6 - Erro licença: " . json_encode($licenca->getErrors()));
                }

                ContextoTemModeloRisco::deleteAll(['contexto_id' => $contexto->id]);
                $contextoTemModeloRisco = new ContextoTemModeloRisco();
                $contextoTemModeloRisco->load(Yii::$app->request->post());
                $contextoTemModeloRisco->contexto_id = $contexto->id;
                if (!$contextoTemModeloRisco->save()) {
                    throw new HttpException(500, '5a - Erro ao salvar o Modelo de Risco, motivo: ' . json_encode($contextoTemModeloRisco->getErrors()));
                }


                //////

                if ($valid) {

                    $projeto->cliente_id = $contexto->cliente_id;

                    if (!$projeto->save()) {
                        throw new HttpException(500, '10a - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors()));
                    }
                }

                $aplicacao = Aplicacao::find()
                    ->joinWith(['unidadeNegocio'])
                    ->where([
                        'unidade_negocio.cliente_id' => $contexto->cliente_id,
                        'aplicacao.status' => Aplicacao::ATIVO,
                    ])
                    ->one();

                if (!$aplicacao) {
                    throw new HttpException(500, "8 - Aplicação não encontrada");
                }

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

                if (!$aplicacaoTemProjeto) {
                    throw new HttpException(500, "8a - Aplicação não está no projeto");
                }

                $aplicacaoTemProjeto->aplicacao_id = $aplicacao->id;

                if (!$aplicacaoTemProjeto->save()) {
                    foreach ($aplicacaoTemProjeto->getErrors() as $key => $value) {
                        foreach ($value as $chave => $erro) {
                            $msgErro .= $erro . '<br />';
                        }
                    }
                    throw new HttpException(500, "9a - Erro: " . $msgErro);
                }

                //////

                //   Utils::debug($contextoTemModeloRisco);

                if ($valid) {
                    $transaction->commit();
                } else {
                    $transaction->rollBack();
                    throw new HttpException(500, $msgErro ?? '');
                }

                if ($valid) {

                    if ($destino == 'view') {
                        return $this->redirect(['/performance/cliente/view', 'id' => $contexto->cliente_id])->send();
                    }

                    return $this->redirect(['/performance/cliente/index'])->send();
                }
            } catch (Exception $exception) {
                $transaction->rollBack();
                throw new HttpException(500, $exception->getMessage());
            }
        }

        $clienteTemModulos = ClienteTemModulo::find()
            ->select('modulo')
            ->where(['cliente_id' => $contexto->cliente_id])
            ->column();

        $modulos = [];
        $modulosPossiveis = ClienteTemModulo::LISTA_MODULOS;
        foreach ($modulosPossiveis as $k => $modulosPossivel) {
            if (in_array($k, $clienteTemModulos)) {
                $modulos[$k] = $modulosPossivel;
            }
        }

        $listaModulosContexto = ContextoTemModulo::find()
            ->select('modulo')
            ->where(['contexto_id' => $contexto->id])
            ->column();
        //  $listaModulosCliente = $modulos;

        $listaConnectors = Projeto::CONNECTORS_LISTA;

        $contextoTemModeloRiscoUpdate = ContextoTemModeloRisco::find()
            ->where([
                'contexto_id' => $contexto->id,
            ])
            ->one();

        $contextoNaturezas = ArrayHelper::map(
            ContextoNatureza::find()
                ->where([
                    'status' => ContextoNatureza::ATIVO,
                ])
                ->all(),
            'id',
            'nome'
        );

        $municipios = ArrayHelper::map(Municipio::find()->innerJoinWith('estado', false)->where(['municipio.status' => Municipio::ATIVO])->orderBy('estado.nome ASC, nome ASC')->all(), 'id', 'nomeEstado', 'estado.nome');

        //   Utils::debug($contextoTemModeloRiscoUpdate);

        // $this->layout = "//empty";
        return $this->render('update', [
            'contexto' => $contexto,
            'advogado' => $advogado,
            'usuarios' => $usuarios,
            'quantidadeUsuarios' => $quantidadeUsuarios,
            'modulos' => $modulos,
            'listaModulosContexto' => $listaModulosContexto,
            'verticais' => $verticais,
            'projetoTemVertical' => $projetoTemVertical,
            'projeto' => $projeto,
            'listaConnectors' => $listaConnectors,
            'riscosModelosLista' => $riscosModelosLista,
            'contextoTemModeloRisco' => $contextoTemModeloRisco,
            'licenca' => $licenca,
            'contextoTemModeloRiscoUpdate' => $contextoTemModeloRiscoUpdate,
            'contextoNaturezas' => $contextoNaturezas,
            'municipios' => $municipios,
        ]);
    }

    public function actionOrganograma($contexto, $aplicacao, $destino = 'contexto')
    {

        \app\models\Base::loga("Acessou o organograma do Contexto", $_GET, $_POST, 35);

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

        $model = Contexto::find()
            ->where([
                'id' => $contexto,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

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

        if (!$model->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::filterMyContextosVisualizacao()
            ->query
            ->select('contexto.id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'contexto.id', $contexto])
            ->column();

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

        $aplicacao = Aplicacao::findOne($aplicacao);

        $organogramaContexto = Contexto::organograma($model, 'contexto');
        $organogramaModal = Contexto::organograma($model, 'modal');

        $listaParents = ArrayHelper::map(Scope::find()
            ->where([
                'contexto_id' => $contexto,
                'status' => Scope::ATIVO,
            ])
            ->all(), 'id', 'name');

        $listaParents = ArrayHelper::htmlDecode($listaParents);

        // Utils::debug($organogramaModal['dados']);
        return $this->render('organograma', [
            'model' => $model,
            'aplicacao' => $aplicacao,
            'organogramaContexto' => $organogramaContexto,
            'organogramaModal' => $organogramaModal,
            'listaParents' => $listaParents,
        ]);
    }

    public function actionCreateOld($cliente_id)
    {

        \app\models\Base::loga("Cadastrou um novo Contexto (Cliente na LGPD)", $_GET, $_POST, 35);

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

        $licenca = new \app\models\Licenca();
        $licenca->status = Licenca::LIBERADO;
        $licenca->valor = str_replace(",", ".", \app\models\Licenca::VALOR_PADRAO);
        $msgErro = '';
        $contexto = new Contexto();
        $contexto->natureza = 'Accia';

        $parceriaGpslgpd = false;

        $cliente = Cliente::find()
            ->join('LEFT JOIN', 'user_has_resource', 'cliente.id = user_has_resource.resource_id')
            ->where([
                'cliente.id' => $cliente_id,
                'cliente.status' => Cliente::ATIVO,
            ])
            ->one();

        if (!$cliente) {
            throw new HttpException(500, "Escritório não encontrado");
        }

        $clienteTemModulos = ClienteTemModulo::find()
            ->select('modulo')
            ->where(['cliente_id' => $cliente->id])
            ->column();

        $modulos = [];
        $modulosPossiveis = ClienteTemModulo::LISTA_MODULOS;
        foreach ($modulosPossiveis as $k => $modulosPossivel) {
            if (in_array($k, $clienteTemModulos)) {
                $modulos[$k] = $modulosPossivel;
            }
        }

        $listaModulosCliente = $modulos;

        $projeto = new Projeto();
        $projeto->nome = Projeto::NOME_PADRAO_LGPD;
        $projeto->cliente_id = $cliente->id;
        $projeto->contextos = null;
        $projeto->ordem = 1;
        $projeto->coleta_necessita_homologacao = 0;
        $projeto->created_by = \Yii::$app->user->identity->id ?? null;
        $projeto->status = Projeto::ATIVO;
        $projeto->created_at = date('Y-m-d H:i:s');

        if (!$projeto->save()) {
            //Utils::debug(microtime());
            foreach ($projeto->getErrors() as $key => $value) {
                foreach ($value as $chave => $erro) {
                    $msgErro .= $erro . '<br />';
                }
            }
            throw new HttpException(500, "1 - Erro: " . $msgErro);
        }

        $verticais = [];
        $verticaisAtivas = Vertical::find()->where(['status' => Vertical::ATIVO])->all();
        foreach ($verticaisAtivas as $k => $verticaisAtiva) {
            $verticais[$verticaisAtiva->id] = $verticaisAtiva->nome;
        }

        $projetoTemVertical = new ProjetoTemVertical();
        $projetoTemVertical->projeto_id = $projeto->id;
        $projetoTemVertical->vertical_id = Vertical::PADRAO_LGPD;
        $projetoTemVertical->ordem = 1;
        $projetoTemVertical->status = ProjetoTemVertical::ATIVO;

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

            foreach ($projetoTemVertical->getErrors() as $key => $value) {
                foreach ($value as $chave => $erro) {
                    $msgErro .= $erro . '<br />';
                }
            }
            throw new HttpException(500, "2 - Erro: " . $msgErro);
        }

        $connectors = Projeto::CONNECTORS;

        $contextoTemModeloRisco = new ContextoTemModeloRisco();

        $riscosModelosLista = [];
        $riscoModelos =  RiscoModelo::find()
            ->where([
                'status' => RiscoModelo::ATIVO,
            ])
            ->all();
        foreach ($riscoModelos as $riscoModelo) {
            if ($riscoModelo->verticalVinculo->status == Vertical::ATIVO) {
                $riscosModelosLista[$riscoModelo->id] = $riscoModelo->nome;
            }
        }

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

            $transaction = Yii::$app->db->beginTransaction();

            try {

                $contexto->active = Contexto::ATIVO;
                $contexto->cliente_id = $cliente->id;
                $contexto->created_at = date('Y-m-d H:i:s');
                $contexto->cadastrado_por = Yii::$app->user->identity->id ?? null;
                $contexto->cota_disco = Contexto::COTA_PADRAO;

                $contexto->file = UploadedFile::getInstance($contexto, 'file');

                if (!$contexto->makeRoot()) {
                    throw new HttpException(500, '4 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                } else {

                    $contexto->logoFile = UploadedFile::getInstance($contexto, 'file');

                    if ($contexto->logoFile) {
                        $contexto->foto = md5(date('Ymd') . $contexto->logoFile->name) . '.' . $contexto->logoFile->extension;
                        if (!$contexto->upload()) {
                            throw new HttpException(500, "3 - Erro ao salvar a foto, motivo: " . json_encode($contexto->getErrors()));
                        }
                        if (!$contexto->save()) {
                            throw new HttpException(500, '14 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                        }
                    }

                    \app\models\Base::loga("Criou o Cliente", $_GET, $_POST, 2, $contexto->id);
                }

                $contextoTemModeloRisco->load(Yii::$app->request->post());
                $contextoTemModeloRisco->contexto_id = $contexto->id;
                if (!$contextoTemModeloRisco->save()) {
                    throw new HttpException(500, '5a - Erro ao salvar o Modelo de Risco, motivo: ' . json_encode($contextoTemModeloRisco->getErrors()));
                }

                $projeto->codigo_pos_coleta = $projeto->projetoCodigoPosColetaOriginal;

                $projeto->load(Yii::$app->request->post());

                if (isset($connectors[$projeto->codigo_pos_coleta])) {
                    $projeto->codigo_pos_coleta = (string) $connectors[$projeto->codigo_pos_coleta];
                } else {
                    $projeto->codigo_pos_coleta = null;
                }

                $projeto->contextos = $projeto->contextos . ',' . $contexto->id;
                if (!$projeto->save()) {
                    throw new HttpException(500, '5 - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors()));
                }

                $licenca->load(Yii::$app->request->post());
                $licenca->criado_por = Yii::$app->user->identity->id ?? null;
                $licenca->criado_em = date('Y-m-d H:i:s');
                $licenca->forma_pagamento = \app\models\Licenca::FORMA_PAGSEGURO;
                $licenca->cliente_id = $cliente->id ?? null;
                $licenca->contexto_id = $contexto->id;
                $licenca->valor = str_replace(",", ".", str_replace(".", ",", str_replace(".", "", $licenca->valor)));
                $referencia = $licenca->cliente_id . '-' . time();
                $licenca->referencia = $referencia;

                if (!$licenca->save()) {
                    throw new HttpException(500, "6 - Erro licença: " . json_encode($licenca->getErrors()));
                }


                $projetoTemVertical->load(Yii::$app->request->post());

                if (!$projetoTemVertical->save()) {
                    throw new HttpException(500, "7 - Erro ao salvar a vertical no projeto, motivo: " . json_encode($projetoTemVertical->getErrors()));
                }


                $faixasPadrao = [];
                $faixasPadrao[] = ['de' => 0, 'ate' => 20, 'cor' => '#df5353'];
                $faixasPadrao[] = ['de' => 20.01, 'ate' => 80, 'cor' => '#e8dd11'];
                $faixasPadrao[] = ['de' => 80.01, 'ate' => 100, 'cor' => '#089f50'];

                foreach ($faixasPadrao as $key => $value) {

                    $projetoTemFaixa = new \app\modules\performance\models\ProjetoTemFaixa();
                    $projetoTemFaixa->projeto_id = $projeto->id;
                    $projetoTemFaixa->de = $value['de'];
                    $projetoTemFaixa->ate = $value['ate'];
                    $projetoTemFaixa->cor = $value['cor'];
                    $projetoTemFaixa->created_at = date('Y-m-d H:i:s');
                    $projetoTemFaixa->created_by = \Yii::$app->user->identity->id ?? null;

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

                        $valid = false;
                        foreach ($projetoTemFaixa->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        throw new HttpException(500, "8 - Erro: " . $msgErro);
                    }
                }


                $aplicacao = Aplicacao::find()
                    ->joinWith(['unidadeNegocio'])
                    ->where([
                        'unidade_negocio.cliente_id' => $contexto->cliente_id,
                        'aplicacao.status' => Aplicacao::ATIVO,
                    ])
                    ->one();

                if (!$aplicacao) {
                    throw new HttpException(500, "8 - Aplicação não encontrada");
                }

                $aplicacaoTemProjeto = new \app\modules\performance\models\AplicacaoTemProjeto();
                $aplicacaoTemProjeto->aplicacao_id = $aplicacao->id;
                $aplicacaoTemProjeto->projeto_id = $projeto->id;

                if (!$aplicacaoTemProjeto->save()) {
                    foreach ($aplicacaoTemProjeto->getErrors() as $key => $value) {
                        foreach ($value as $chave => $erro) {
                            $msgErro .= $erro . '<br />';
                        }
                    }
                    throw new HttpException(500, "9 - Erro: " . $msgErro);
                }

                $verticalId = null;

                $projetoTemVertical = \app\modules\performance\models\ProjetoTemVertical::find()
                    ->where(['projeto_id' => $projeto->id])
                    ->one();

                if ($projetoTemVertical) {
                    $verticalId = $projetoTemVertical->vertical_id;
                }

                if ($verticalId == Vertical::ID_INSTALACOES_CORPORATIVAS) {
                    $geraOrganograma = \app\models\Scope::geraOrganogramaInstalacoesCorporativas($contexto, $verticalId);
                    if (!$geraOrganograma) {
                        throw new HttpException(500, "12 - Erro (instalações corporativas): " . $geraOrganograma);
                    }
                }

                if ($verticalId == Vertical::ID_SE_UHE_UEO) {
                    $geraOrganograma = \app\models\Scope::geraOrganogramaSeUheUeo($contexto, $verticalId);
                    if (!$geraOrganograma) {
                        throw new HttpException(500, "12 - Erro (instalações corporativas): " . $geraOrganograma);
                    }
                }

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


                $coleta = \app\modules\performance\models\Coleta::geraColetaGenericaInicial($nome, $verticalId, $projeto->id, $contexto->id, \Yii::$app->user->identity->id, null);

                if (!$coleta) {
                    throw new HttpException(500, "10 - Erro ao criar a coleta, motivo: " . json_encode($coleta));
                }

                $geraArvore = \app\modules\performance\models\AnexoArvore::geraArvorePadrao($contexto);
                if (!$geraArvore) {
                    throw new HttpException(500, "11 - Erro: " . $geraArvore);
                }

                foreach ($contexto->modulos as $modulo) {
                    $contextoTemModulo = new ContextoTemModulo();
                    $contextoTemModulo->contexto_id = $contexto->id;
                    $contextoTemModulo->modulo = $modulo;

                    if (!$contextoTemModulo->save()) {
                        $valid = false;
                        foreach ($contextoTemModulo->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        throw new HttpException(500, "13 - Erro: " . $msgErro);
                    }
                }

                // Yii::$app->mailer->compose('_nova_licenca_audisa', [
                //     'contexto' => $contexto,
                //     'licenca' => $licenca,
                // ])
                //     ->setFrom('no-reply@krinom.com.br')
                //     ->setTo('gledson@krinom.com.br')
                //     ->setCc(['gledson@krinom.com.br'])
                //     ->setBcc(['gledson@krinom.com.br'])
                //     ->setSubject('Nova Licença ' . getenv('NOME_PLATAFORMA'))
                //     ->send();

                //desabilitado temporariamente                
                //                if ($valid) {
                //                    if ($contexto->contato_principal_email) {
                //                        Yii::$app->mailer->compose('_bemvindocontato', [
                //                                    'contexto' => $contexto,
                //                                ])
                //                                ->setFrom('no-reply@krinom.com.br')
                //                                ->setTo($contexto->contato_principal_email)
                //                                ->setBcc(['gledson@krinom.com.br'])
                //                                ->setSubject('Bem-vindo a AUDISA!')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.1. Email-Cust_Inicial.docx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.2. Analise_Regulatoria.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.3. Dimensionamento.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.4. Responsavel.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.5. DPO.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.6. Comite.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.7. Certificações.xlsx')                               
                //                                ->send();
                //                    }
                //                }



                $transaction->commit();

                return $this->redirect(['/performance/cliente/view', 'id' => $cliente_id])->send();
            } catch (Exception $exception) {
                $transaction->rollBack();
                // Utils::debug($exception);
                throw new HttpException(500, $exception->getMessage());
            }
        }

        $listaConnectors = Projeto::CONNECTORS_LISTA;

        $contextoNaturezas = ArrayHelper::map(
            ContextoNatureza::find()
                ->where([
                    'status' => ContextoNatureza::ATIVO,
                ])
                ->all(),
            'id',
            'nome'
        );

        $municipios = ArrayHelper::map(Municipio::find()->innerJoinWith('estado', false)->where(['municipio.status' => Municipio::ATIVO])->orderBy('estado.nome ASC, nome ASC')->all(), 'id', 'nomeEstado', 'estado.nome');

        $userAdvogado = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
            ->where([
                'profile.cliente_id' => $cliente->id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->all(), 'id', 'name');

        $userResponsavel = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere(['=', 'user_has_resource.role', UserHasResource::NV_CP_CLIENTE_ADM])
            ->andWhere(['=', 'user_has_resource.resource_id', $cliente->id])
            ->all(), 'id', 'name');


        $userAdmin =  ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'auth_assignment', 'user_ceon.id=auth_assignment.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere([
                'OR',
                ['=', 'auth_assignment.item_name', 'Admin'],
                ['=', 'auth_assignment.item_name', 'Admininistrador'],
            ])
            ->all(), 'id', 'name');

        $advogado = array_replace_recursive($userAdvogado, $userResponsavel, $userAdmin);

        // Utils::debug($municipios);
        return $this->render('create', [
            'cliente' => $cliente,
            'contexto' => $contexto,
            'licenca' => $licenca,
            'providerCupom' => [],
            'parceriaGpslgpd' => $parceriaGpslgpd,
            'modulos' => $modulos,
            'listaModulosCliente' => $listaModulosCliente,
            'verticais' => $verticais,
            'projetoTemVertical' => $projetoTemVertical,
            'projeto' => $projeto,
            'listaConnectors' => $listaConnectors,
            'contextoTemModeloRisco' => $contextoTemModeloRisco,
            'riscosModelosLista' => $riscosModelosLista,
            'contextoNaturezas' => $contextoNaturezas,
            'municipios' => $municipios,
            'advogado' => $advogado,
        ]);
    }

    public function actionLgpdDelete($id)
    {

        \app\models\Base::loga("Excluiu um Contexto da LGPD (Cliente)", $_GET, $_POST, 35);

        $contexto = Contexto::find()
            ->where([
                'id' => $id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

        if ($contexto->tipoLicenca == 'Licenciado') {
            throw new HttpException(500, "Erro! Cliente licencidado não pode ser excluído");
        }

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

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

        $contexto->active = Contexto::INATIVO;

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

        return true;
    }

    public function actionEspecialOrganograma($id, $token)
    {

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

        if ($token == md5('1' . date('Ymd'))) {

            $coleta = Coleta::findOne($id);
            if ($coleta) {
                $organograma = Contexto::organograma($coleta->contexto);

                return $this->render('especial_organograma', [
                    'organograma' => $organograma,
                ]);
            }
        }
    }

    public function actionEspecialOrganogramaPaisagem($id, $token)
    {

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

        if ($token == md5('1' . date('Ymd'))) {

            $coleta = Coleta::findOne($id);
            if ($coleta) {
                $organograma = Contexto::organograma($coleta->contexto);

                return $this->render('especial_organograma_paisagem', [
                    'organograma' => $organograma,
                ]);
            }
        }
    }

    public function actionLiberarAcesso($contexto_id, $aplicacao_id)
    {

        \app\models\Base::loga("Liberou acesso temporário a um Cliente", $_GET, $_POST, 35);

        if (Logged::isCeonFinanceiro()) {
            throw new HttpException(403, "Acesso negado");
        }

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

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

        $acessoTemporarioContexto = new \app\models\AcessoTemporarioContexto();

        $aplicacao = Aplicacao::findOne($aplicacao_id);

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

        $acessoTemporarioContextoExistem = \app\models\AcessoTemporarioContexto::find()
            ->where(['contexto_id' => $contexto_id])
            ->all();

        foreach ($acessoTemporarioContextoExistem as $acessoTemporarioContextoExiste) {
            $acessoTemporarioContexto->items[] = [
                'user_id' => $acessoTemporarioContextoExiste->user_id,
                'data_inicio' => $acessoTemporarioContextoExiste->data_inicio,
                'data_fim' => $acessoTemporarioContextoExiste->data_fim,
            ];
        }


        $usuarios = User::find()
            ->join('LEFT JOIN', 'auth_assignment', 'user_ceon.id=auth_assignment.user_id')
            ->where([
                'auth_assignment.item_name' => Logged::ROLE_CEONFINANCEIRO,
                'user_ceon.status' => User::STATUS_ACTIVE,
            ])
            ->all();

        $listaUsuarios = [];
        foreach ($usuarios as $usuario) {
            $listaUsuarios[$usuario->id] = $usuario->name . ' - ' . $usuario->email;
        }

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

            $acessoTemporarioContexto->user_id = Yii::$app->user->identity->id ?? null;
            $acessoTemporarioContexto->contexto_id = $contexto_id;
            $acessoTemporarioContexto->data_inicio = date('Y-m-d');
            $acessoTemporarioContexto->data_fim = date('Y-m-d');
            $acessoTemporarioContexto->autorizado_por = Yii::$app->user->identity->id ?? null;
            $acessoTemporarioContexto->autorizado_em = date('Y-m-d H:i:s');


            if ($acessoTemporarioContexto->validate()) {
                $connection = \Yii::$app->db;

                $transaction = $connection->beginTransaction();

                try {

                    $valid = true;

                    \app\models\AcessoTemporarioContexto::deleteAll(['contexto_id' => $contexto_id]);

                    if ($acessoTemporarioContexto->items) {
                        foreach ($acessoTemporarioContexto->items as $key => $item) {
                            if ($valid) {
                                $acesso = new \app\models\AcessoTemporarioContexto();
                                $acesso->contexto_id = $contexto_id;

                                $acesso->autorizado_por = Yii::$app->user->identity->id ?? null;

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

                                $acesso->setAttributes($item, false);

                                if ($acesso->data_inicio) {
                                    $explodeDataInicio = explode("/", $acesso->data_inicio);
                                    $acesso->data_inicio = $explodeDataInicio[2] . '-' . $explodeDataInicio[1] . '-' . $explodeDataInicio[0];
                                }

                                if ($acesso->data_fim) {
                                    $explodeDataFim = explode("/", $acesso->data_fim);
                                    $acesso->data_fim = $explodeDataFim[2] . '-' . $explodeDataFim[1] . '-' . $explodeDataFim[0];
                                }

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

                    $transaction->commit();
                    return $this->redirect(['/performance/aplicacao/lgpd', 'id' => $aplicacao->id ?? null]);
                } catch (Exception $e) {
                    $transaction->rollback();
                    Yii::$app->session->setFlash('error', $e->getMessage());
                }
            }
        }


        return $this->render('acesso_temporario_contexto', [
            'acessoTemporarioContexto' => $acessoTemporarioContexto,
            'listaUsuarios' => $listaUsuarios,
            'aplicacao' => $aplicacao,
        ]);
    }

    public function actionViewToken($token, $id, $aplicacao_id, $selectcoleta0 = null, $selectcoleta1 = null, $coletaplanoacao = null, $vertical_indicador_id = null)
    {


        \app\models\Base::loga("Acessou a visualização de Contexto via Token", $_GET, $_POST, 49, $id);

        if ($token != "lGRUQrMvnCTzF8ovZrSRaz5bk3wuAlGRUQrMvnCTzF8ovZrSRaz5bk3wuA") {
            return "Erro 1";
        }

        $this->layout = '//contexto_inventario_fora';
        Url::remember();

        $contexto = Contexto::find()
            ->where([
                'id' => $id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

        $aplicacao = Aplicacao::find()
            ->where([
                'id' => $aplicacao_id,
                'status' => Aplicacao::ATIVO,
            ])
            ->one();

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

        $projetos = AplicacaoTemProjeto::find()
            ->select('projeto_id')
            ->where(['aplicacao_id' => $aplicacao->id])
            ->column();

        $coletas = Coleta::find()
            ->where([
                'contexto_id' => $contexto->id,
                'status' => Coleta::ATIVO,
            ])
            ->andWhere(['in', 'projeto_id', $projetos])
            ->andWhere(['is not', 'data_coleta', new \yii\db\Expression('null')])
            ->orderBy('data_coleta ASC, id ASC')
            ->all();

        $coletasIds = [];
        $totalColetas = 0;
        $valorGlobal = 0;
        $coletaValores = [];
        $coletaNomes = [];
        $coletasIdNome = [];
        $percentual = 0;
        $evolucao = '';
        $totalIndicadores = 0;
        $totalIndicadoresDemandamAtencao = 0;
        $coletaApoioValorGlobal = 0;
        $coletaReferenciaIndicadores = null;
        $percentualIndicadorComprometedor = 0;
        $percentualIndicadorMercado = 0;
        $percentualIndicadorExcelencia = 0;
        $verticeColetaReferencia = null;

        $coletaReferencia = null; //dados exibidos
        $coletaApoio = null; //dados comparativos

        $listaValoresGlobais = [];
        foreach ($coletas as $coleta) {
            $cvG = $coleta->valorGlobal;
            $listaValoresGlobais[$coleta->id] = $cvG;
            $coletaValores[] = $cvG;
            $coletaNomes[] = $coleta->nome;
        }

        if ($selectcoleta0 && $selectcoleta1) {

            foreach ($coletas as $coleta) {

                if ($coleta->id == $selectcoleta1) {
                    $coletaReferencia = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta1])) {
                        $valorGlobal = $listaValoresGlobais[$selectcoleta1];
                    }
                }
            }
            foreach ($coletas as $coleta) {
                if ($coleta->id == $selectcoleta0) {
                    $coletaApoio = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta0])) {
                        $coletaApoioValorGlobal = $listaValoresGlobais[$selectcoleta0];
                    }
                }
            }
        } elseif ($selectcoleta0 && !$selectcoleta1) {

            foreach ($coletas as $coleta) {

                if ($coleta->id == $selectcoleta0) {
                    $coletaReferencia = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta0])) {
                        $valorGlobal = $listaValoresGlobais[$selectcoleta0];
                    }
                    break;
                }
            }
        } else {
            foreach ($coletas as $coleta) {
                $coletaReferencia = $coleta;
                if (isset($listaValoresGlobais[$coleta->id])) {
                    $valorGlobal = $listaValoresGlobais[$coleta->id];
                }
                $coletasIdNome[$coleta->id] = $coleta->nome;
                $coletasIds[] = $coleta->id;
            }
        }

        foreach ($coletas as $coleta) {
            $totalColetas++;
            $coletasIdNome[$coleta->id] = $coleta->nome;
            $coletasIds[] = $coleta->id;
            if (!$coletaReferencia) {
                $coletaReferencia = $coleta;
            }
        }

        /*
         * Verificando se os select pertencem
         */
        if ($selectcoleta0 && !in_array($selectcoleta0, $coletasIds)) {
            throw new HttpException(500, "Coleta selecionada não pertence ao Contexto");
        }
        if ($selectcoleta1 && !in_array($selectcoleta1, $coletasIds)) {
            throw new HttpException(500, "Coleta comparada não pertence ao Contexto");
        }

        $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        $percentual = 0;


        if ($selectcoleta0 && $selectcoleta1) {

            if (
                is_numeric($selectcoleta0) &&
                $selectcoleta0 != 0 &&
                is_numeric($selectcoleta1) &&
                isset($listaValoresGlobais[$selectcoleta0]) &&
                isset($listaValoresGlobais[$selectcoleta1])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta1] / (int) $listaValoresGlobais[$selectcoleta0]) - 1) * 100, 2);
            }
        } elseif ($selectcoleta1) {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($selectcoleta1) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                isset($listaValoresGlobais[$selectcoleta1])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta1] / (int) $listaValoresGlobais[$primeiraCol]) - 1) * 100, 2);
            }
        } elseif ($selectcoleta0) {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($selectcoleta0) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                $listaValoresGlobais[$primeiraCol] != 0 &&
                isset($listaValoresGlobais[$selectcoleta0])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta0] / (int) $listaValoresGlobais[$primeiraCol]) - 1) * 100, 2);
            }
        } else {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;
            $ultimaCol = end($listaTemp);

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($ultimaCol) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                // $listaValoresGlobais[$primeiraCol] != 0 &&
                isset($listaValoresGlobais[$ultimaCol])
            ) {

                $pontuacao1 = $listaValoresGlobais[$primeiraCol];
                if ($pontuacao1 == 0) {
                    $pontuacao1 = 1;
                }
                $percentual = round((((int) $listaValoresGlobais[$ultimaCol] / (int) $pontuacao1) - 1) * 100, 2);
            }
        }


        //        if (isset($coletaValores[0])) {
        //            if (is_numeric($coletaValores[0]) && $coletaValores[0] != 0 && is_numeric(end($coletaValores)) && end($coletaValores) != 0) {
        //                $percentual = round((((int) end($coletaValores) / (int) $coletaValores[0]) - 1) * 100, 2);

        $icone = '<i class="fas fa-arrow-circle-up" style="color:#089F50"></i>';

        if ($percentual == 0) {

            $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        }
        if ($percentual < 0) {
            $icone = '<i class="fas fa-arrow-circle-down" style="color:#DF5353"></i>';
        }

        $evolucao = str_replace(".", ",", floatval($percentual)) . '% ' . $icone;
        //        }
        //    }
        //        if (isset($coletaValores[0])) {
        //            if (is_numeric($coletaValores[0]) && $coletaValores[0] != 0 && is_numeric(end($coletaValores)) && end($coletaValores) != 0) {
        //                $percentual = round((((int) end($coletaValores) / (int) $coletaValores[0]) - 1) * 100, 2);
        //
        //                $icone = '<i class="fas fa-arrow-circle-up" style="color:#089F50"></i>';
        //
        //                if ($percentual == 0) {
        //
        //                    $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        //                }
        //                if ($percentual < 0) {
        //                    $icone = '<i class="fas fa-arrow-circle-down" style="color:#DF5353"></i>';
        //                }
        //
        //                $evolucao = str_replace(".", ",", floatval($percentual)) . '% ' . $icone;
        //            }
        //        }

        $minimoComprometedor = 0;
        $minimoExcelencia = 80;

        $totalIndicadores = 0;
        $totalIndicadoresDemandamAtencao = 0;

        $listaNomeIndicadores = [];
        $listaValoresIndicadores = [];
        $indiceIndicador = 0;

        /*
         * 
         */
        $coletaReferenciaIndicacores = null;
        $coletaReferenciaIndicacoresExcelencia = 0;
        $coletaReferenciaIndicacoresMercado = 0;
        $coletaReferenciaIndicacoresComprometedor = 0;
        $coletaReferenciaListaIndicacoresExcelencia = [];
        $coletaReferenciaListaIndicacoresMercado = [];
        $coletaReferenciaListaIndicacoresComprometedor = [];

        //$gppCausaProvaveis = ArrayHelper::map(GppCausaProvavel::find()->all(), 'id', 'vertical_indicador_id');
        $gppCausaProvaveis = [];
        //        $paPlanoAcaos = ArrayHelper::map(
        //                        PlanoAcao::find()
        //                                ->where([
        //                                    'contexto_id' => $contexto->id ?? null,
        //                                    'status' => PlanoAcao::ATIVO,
        //                                ])
        //                                ->all(), 'id', 'vertical_indicador_id');

        $paPlanosAcaoTemVertical = \app\modules\performance\models\PlanoAcaoTemIndicador::find()
            ->joinWith('paPlanoAcao')
            ->select('pa_plano_acao_tem_indicador.vertical_indicador_id')
            ->where([
                'contexto_id' => $contexto->id ?? null,
                'status' => PlanoAcao::ATIVO,
            ])
            ->column();
        //Utils::debug($paPlanosAcaoTemVertical);

        if ($coletaReferencia) {

            $indicadorSparkline = [];

            $coletaIndicadoresSparkline = ColetaIndicador::find()
                ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id=coleta_indicador.estrutura_id')
                ->join('LEFT JOIN', 'coleta', 'coleta.id=coleta_estrutura.coleta_id')
                ->where([
                    'coleta.projeto_id' => $coletaReferencia->projeto_id,
                    'coleta.vertical_id' => $coletaReferencia->vertical_id,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta.contexto_id' => $contexto->id ?? null,
                    'coleta.status' => Coleta::ATIVO,
                ])
                ->orderBy('coleta.data_coleta ASC, coleta.id ASC')
                ->all();

            foreach ($coletaIndicadoresSparkline as $coletaIndicadorSparkline) {
                if ($coletaIndicadorSparkline->vertical_indicador_id) {
                    $indicadorSparkline[$coletaIndicadorSparkline->vertical_indicador_id][] = $coletaIndicadorSparkline->pontuacao;
                }
            }

            $coletaReferenciaIndicadores = ColetaIndicador::find()
                ->select([
                    'coleta_indicador.id as id',
                    'coleta_indicador.nome as nome',
                    'coleta_indicador.pontuacao as pontuacao',
                    'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                    'coleta_indicador.conceito as conceito',
                    'coleta_indicador.estrutura_id as estrutura_id',
                    'vertical_indicador.usa_interpolacao as usainterpolacao',
                ])
                ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                ->where([
                    'coleta_estrutura.coleta_id' => $coletaReferencia->id,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO
                ])
                ->asArray()
                ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                ->all();
            foreach ($coletaReferenciaIndicadores as $coletaReferenciaIndicador) {

                $listaNomeIndicadores[] = $coletaReferenciaIndicador['nome'];

                $listaValoresIndicadores[] = ['y' => (int) $coletaReferenciaIndicador['pontuacao']];

                $minimoTemp = 0;
                $maximoTemp = 0;
                foreach ($coletaReferenciaIndicador['coletaAlternativas'] as $coletaAlternativaExcelencia) {
                    if ($coletaAlternativaExcelencia['nivel_referencia'] < $minimoTemp) {
                        $minimoTemp = $coletaAlternativaExcelencia['nivel_referencia'];
                    }
                    if ($coletaAlternativaExcelencia['nivel_referencia'] > $maximoTemp) {
                        $maximoTemp = $coletaAlternativaExcelencia['nivel_referencia'];
                    }
                }
                $coletaReferenciaIndicador['minimo'] = $minimoTemp;
                $coletaReferenciaIndicador['maximo'] = $maximoTemp;
                $coletaReferenciaIndicador['ordem'] = $indiceIndicador;
                $coletaReferenciaIndicador['vertical_indicador_id'] = $coletaReferenciaIndicador['vertical_indicador_id'];
                $coletaReferenciaIndicador['usainterpolacao'] = $coletaReferenciaIndicador['usainterpolacao'];

                $coletaReferenciaIndicador['sparkline'] = '';
                if (isset($indicadorSparkline[$coletaReferenciaIndicador['vertical_indicador_id']])) {
                    $coletaReferenciaIndicador['sparkline'] = implode(",", $indicadorSparkline[$coletaReferenciaIndicador['vertical_indicador_id']]);
                }

                //                if (in_array($coletaReferenciaIndicador['vertical_indicador_id'], $gppCausaProvaveis)) {
                //                    $coletaReferenciaIndicador['planoaplicacao'] = '<i class="fab fa-product-hunt" title="Possui Plano de Ação"></i>';
                //                } else
                if (in_array($coletaReferenciaIndicador['vertical_indicador_id'], $paPlanosAcaoTemVertical)) {
                    $coletaReferenciaIndicador['planoaplicacao'] = '<i class="fab fa-product-hunt" title="Possui Plano de Ação"></i>';
                } else {
                    $coletaReferenciaIndicador['planoaplicacao'] = '';
                }

                if ($coletaReferenciaIndicador['pontuacao'] >= $minimoExcelencia) {

                    $coletaReferenciaListaIndicacoresExcelencia[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresExcelencia++;
                } elseif ($coletaReferenciaIndicador['pontuacao'] <= $minimoComprometedor) {

                    $coletaReferenciaListaIndicacoresComprometedor[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresComprometedor++;
                    $totalIndicadoresDemandamAtencao++;
                } else {

                    $coletaReferenciaListaIndicacoresMercado[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresMercado++;
                }

                $indiceIndicador++;
            }

            $totalIndicadores = count($coletaReferenciaIndicadores);


            $percentualIndicadorComprometedor = 0;
            $percentualIndicadorMercado = 0;
            $percentualIndicadorExcelencia = 0;
            if ($totalIndicadores > 0) {
                $percentualIndicadorComprometedor = ($coletaReferenciaIndicacoresComprometedor / $totalIndicadores) * 100;
                $percentualIndicadorComprometedor = round($percentualIndicadorComprometedor, 2);

                $percentualIndicadorMercado = ($coletaReferenciaIndicacoresMercado / $totalIndicadores) * 100;
                $percentualIndicadorMercado = round($percentualIndicadorMercado, 2);

                $percentualIndicadorExcelencia = 100 - ($percentualIndicadorMercado + $percentualIndicadorComprometedor);
                $percentualIndicadorExcelencia = round($percentualIndicadorExcelencia, 2);

                $percentualIndicadorComprometedor = str_replace(".", ",", $percentualIndicadorComprometedor);
                $percentualIndicadorMercado = str_replace(".", ",", $percentualIndicadorMercado);
                $percentualIndicadorExcelencia = str_replace(".", ",", $percentualIndicadorExcelencia);
            }
        }

        $verticalPeriodicidade = Vertical::PERIODO_UNICO;
        if ($coletaReferencia && $coletaReferencia->vertical) {

            $verticalColetaReferencia = $coletaReferencia->vertical;

            if ($verticalColetaReferencia->periodicidade == Vertical::PERIODO_DIARIO) {
                $verticalPeriodicidade = $verticalColetaReferencia->periodicidade;
            }
        }

        $parametrosCliente = ClienteTemParametro::find()
            ->where(['cliente_id' => $contexto->cliente_id, 'status' => ClienteTemParametro::ATIVO,])
            ->all();

        $parametrosContexto = ContextoTemParametro::find()
            ->where(['contexto_id' => $contexto->id, 'status' => ContextoTemParametro::ATIVO,])
            ->all();

        $parametrosLabel = [];
        foreach ($parametrosCliente as $parametroCliente) {
            if ($parametroCliente->tipo == ClienteTemParametro::LABEL) {
                $parametrosLabel[$parametroCliente->parametro] = $parametroCliente->valor;
            }
        }
        foreach ($parametrosContexto as $parametroContexto) {
            if ($parametroContexto->tipo == ContextoTemParametro::LABEL) {
                $parametrosLabel[$parametroContexto->parametro] = $parametroContexto->informacao;
            }
        }

        $verticeUltimaColeta = null;
        $coletaEstruturaPvfs = null;

        $minProjeto = 0;
        $maxProjeto = 100;

        $faixasPadrao = [];
        $plots = [];

        if ($coletaReferencia) {

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

            $coletaEstruturaPvfs = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coletaReferencia->id,
                    'cod_pai' => $verticeColetaReferencia ? $verticeColetaReferencia->id : null,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->orderBy('ordem ASC')
                ->all();

            $faixasPadrao = $coletaReferencia->faixasPadrao;

            foreach ($faixasPadrao as $key => $v) {

                //list($r, $g, $b) = sscanf($v['color'], "#%02x%02x%02x");
                //$plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];

                $plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => str_replace(",0.9", ",0.4", $v['color']), 'zIndex' => 0];

                if ($v["from"] < $minProjeto) {
                    $minProjeto = $v["from"];
                }
                if ($v["to"] > $maxProjeto) {
                    $maxProjeto = $v["to"];
                }
            }
        }

        $coletaApoioIndicacoresComprometedor = 0;
        $coletaApoioIndicacoresMercado = 0;
        $coletaApoioIndicacoresExcelencia = 0;
        $coletaApoiolistaValoresIndicadores = [];
        $coletaApoioEstruturaPvf = [];

        if ($coletaApoio) {

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

            $coletaApoioEstruturaPvf = ArrayHelper::map(ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coletaApoio->id,
                    'cod_pai' => $verticeColetaApoio ? $verticeColetaApoio->id : null,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->orderBy('ordem ASC')
                ->all(), 'nome', 'pontuacao');

            $coletaApoioIndicadores = ColetaIndicador::find()
                ->select([
                    'coleta_indicador.id as id',
                    'coleta_indicador.nome as nome',
                    'coleta_indicador.pontuacao as pontuacao',
                    'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                    'coleta_indicador.conceito as conceito',
                    'coleta_indicador.estrutura_id as estrutura_id',
                    'vertical_indicador.usa_interpolacao as usainterpolacao',
                ])
                ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                ->where([
                    'coleta_estrutura.coleta_id' => $coletaApoio->id,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO
                ])
                ->asArray()
                ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                ->all();

            foreach ($coletaApoioIndicadores as $coletaApoioIndicador) {
                if ($coletaApoioIndicador['pontuacao'] >= $minimoExcelencia) {
                    $coletaApoioIndicacoresExcelencia++;
                } elseif ($coletaApoioIndicador['pontuacao'] <= $minimoComprometedor) {
                    $coletaApoioIndicacoresComprometedor++;
                } else {
                    $coletaApoioIndicacoresMercado++;
                }

                $coletaApoiolistaValoresIndicadores[] = ['y' => (int) $coletaApoioIndicador['pontuacao']];
            }
        }

        $responsaveis = [];
        $dadosVerticalIndicadorResponsavel = [];
        $indicadorResponsavelOrdem = [];

        if ($coletaReferencia) {

            //            $dadosResponsaveis = VerticalIndicadorTemParametro::find()
            //                    ->join('LEFT JOIN', 'coleta_indicador', 'vertical_indicador_tem_parametro.vertical_indicador_id=coleta_indicador.vertical_indicador_id')
            //                    ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_indicador.estrutura_id=coleta_estrutura.id')
            //                    ->where([
            //                        'vertical_indicador_tem_parametro.parametro' => 'Responsável',
            //                        'coleta_estrutura.coleta_id' => $coletaReferencia->id,
            //                        'vertical_indicador_tem_parametro.status' => VerticalIndicadorTemParametro::ATIVO,
            //                        'coleta_indicador.status' => ColetaIndicador::ATIVO,
            //                        'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
            //                    ])
            //                    ->orderBy('vertical_indicador_tem_parametro.valor')
            //                    ->all();
            //
            //
            //            foreach ($dadosResponsaveis as $dadoResponsavel) {
            //                $responsaveis[str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor))] = $dadoResponsavel->valor;
            //
            //                $dadosVerticalIndicadorResponsavel[$dadoResponsavel->vertical_indicador_id] = str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor));
            //            }
            //            foreach ($coletaReferenciaIndicadores as $indicadorColetaAll) {
            //
            //                if (isset($dadosVerticalIndicadorResponsavel[$indicadorColetaAll['vertical_indicador_id']])) {
            //                    $indicadorResponsavelOrdem[] = $dadosVerticalIndicadorResponsavel[$indicadorColetaAll['vertical_indicador_id']];
            //                } else {
            //                    $indicadorResponsavelOrdem[] = '';
            //                }
            //            }
        }

        $dadosContexto = [];

        //        $fotos = Foto::find()
        //                ->joinWith('coleta')
        //                ->where([
        //                    'foto.status' => Foto::ATIVO,
        //                    'coleta.status' => Coleta::ATIVO,
        //                ])
        //                ->andwhere(['in', 'coleta.id', $coletasIds])
        //                ->all();
        //        $timelines = Timeline::find()
        //                ->where([
        //                    'tipo' => Timeline::TIPO_CONTEXTO,
        //                    'vinculo' => $contexto->id,
        //                    'status' => Timeline::ATIVO,
        //                ])
        //                ->orderBy('data_cadastro DESC')
        //                ->all();

        $pareceresTecnicos = ParecerTecnicoColeta::find()
            ->joinWith('coleta')
            ->joinWith(['createdBy', 'updatedBy update'])
            ->where([
                'coleta.contexto_id' => $contexto->id,
                'parecer_tecnico_coleta.status' => ParecerTecnicoColeta::ATIVO
            ])
            ->andWhere(['>', 'parecer_tecnico_coleta.created_at', '2019-08-15 08:00:00'])
            ->orderBy('id ASC')
            ->asArray()
            ->all();

        //        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
        //                ->joinWith(['createdBy'])
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
        //                ])
        //                ->orderBy('prioridade ASC, id DESC')
        //                ->all();
        //
        //        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

        $anexos = Anexo::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $contexto->id,
                'anexo.status' => Anexo::ATIVO
            ])
            ->orderBy('id ASC')
            ->asArray()
            ->all();

        $totalDisco = 0;
        foreach ($anexos as $anexo) {
            $totalDisco += $anexo['tamanho'];
        }
        $totalGB = round(($totalDisco / 1000000000), 3);
        $percentualDisco = round($totalGB / $contexto->cota_disco, 3);

        if ($percentualDisco >= 80) {
            $bgDisco = 'red';
        } elseif ($percentualDisco >= 60) {
            $bgDisco = 'orange';
        } elseif ($percentualDisco >= 40) {
            $bgDisco = 'yellow';
        } elseif ($percentualDisco >= 20) {
            $bgDisco = 'blue';
        } else {
            $bgDisco = 'green';
        }

        if ($percentualDisco > 60) {
            Yii::$app->mailer->compose('_cota_contexto', [
                'contexto' => $contexto,
                'percentualDisco' => $percentualDisco,
            ])
                ->setFrom(['no-reply@krinom.com.br' => 'Accia'])
                ->setTo('gledson@krinom.com.br')
                ->setSubject('Contexto com uso de cota de disco elevada na Accia')
                ->send();
        }

        $totalGB = str_replace(".", ",", $totalGB);

        $contatos = '';
        foreach ($contexto->contextoTemContatos as $contextoContato) {
            if ($contextoContato->status == ContextoTemContato::ATIVO) {
                $contatos .= $contextoContato->contato . "<br />";
            }
        }


        $docsExiste = [];

        foreach ($contexto->cliente->clienteTemDocs as $clienteTemDoc) {
            if ($clienteTemDoc->status == ClienteTemDocs::ATIVO) {
                $docsExiste[] = $clienteTemDoc->doc;
            }
        }

        //        $pesePlanoAplicacaoFullModel = PesePlanoAplicacao::find()
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'tipo' => PesePlanoAplicacao::FULL,
        //                    'status' => PesePlanoAplicacao::ATIVO,
        //                ])
        //                ->one();
        //
        //        $pesePlanoAplicacaoFull = PesePlanoAplicacao::full($pesePlanoAplicacaoFullModel);
        //
        //        $pesePlanoAplicacaoBasicModel = PesePlanoAplicacao::find()
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'tipo' => PesePlanoAplicacao::BASIC,
        //                    'status' => PesePlanoAplicacao::ATIVO,
        //                ])
        //                ->one();
        //
        //        $pesePlanoAplicacaoBasic = PesePlanoAplicacao::basic($pesePlanoAplicacaoBasicModel);
        //
        //        $pesePlanoAplicacaoDashboard = PesePlanoAplicacao::dashboard($pesePlanoAplicacaoFullModel, $pesePlanoAplicacaoBasicModel);
        //
        //        $planoAplicacaoSegmentos = \yii\helpers\ArrayHelper::map(
        //                        PeseSegmento::find()
        //                                ->where(['status' => PeseSegmento::ATIVO])
        //                                ->orderBy('descricao ASC')->all(),
        //                        'id', 'descricao');
        //
        //        $servicosContratados = ContextoTemServico::find()
        //                ->select('servico')
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'status' => ContextoTemServico::ATIVO,
        //                ])
        //                ->column();

        $isCeon = Logged::isCeon();

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

        $coresPadrao = [];
        $coresPadrao[0] = \app\modules\risk\models\RiscoCenario::COR_BAIXO;
        $coresPadrao[1] = \app\modules\risk\models\RiscoCenario::COR_MODERADO;
        $coresPadrao[2] = \app\modules\risk\models\RiscoCenario::COR_ALTO;
        $coresPadrao[3] = \app\modules\risk\models\RiscoCenario::COR_CRITICO;


        $coresPadrao = [];
        $coresPadrao[0] = 'rgba(8,159,80, 0.15)';
        $coresPadrao[1] = 'rgba(232,221,17, 0.15)';
        $coresPadrao[2] = 'rgba(223,83,83, 0.15)';
        $coresPadrao[3] = 'rgba(223,83,83, 0.15)';


        $riscoCenario = \app\modules\risk\models\RiscoCenario::find()
            ->where(['status' => RiscoCenario::ATIVO])
            ->andWhere(['in', 'coleta_vinculo', $coletasIds])
            ->orderBy('id DESC')
            ->one();

        $riscosCategorias = [];
        $cores = [];
        $coresPadrao = [];
        $cenarios = [];

        if ($riscoCenario) {
            $riscosCategorias = \app\modules\risk\models\RiscoModelo::riscoCategoria($riscoCenario->riscoModelo);

            $cores = $riscoCenario->cores['cores'];
            $coresPadrao = $riscoCenario->cores['coresPadrao'];

            $cenarios = \app\modules\risk\models\RiscoCenario::find()
                ->join('LEFT JOIN', 'coleta', 'risco_cenario.coleta_vinculo=coleta.id')
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'risco_cenario.status' => \app\modules\risk\models\Risco::ATIVO,
                ])
                ->andWhere(['=', 'coleta.contexto_id', $contexto->id])
                ->all();
        }

        $todosCenarios = [];
        $todosCenariosPontuacao = [];
        $todosCenariosDrilldrown = [];
        $todosRiscos = [];
        $maxPontuacaoRisco = 0;

        foreach ($cenarios as $cenario) {


            if ($cenario->pontuacao <= 25) {
                $cor = $coresPadrao[0];
            } elseif ($cenario->pontuacao <= 50) {
                $cor = $coresPadrao[1];
            } elseif ($cenario->pontuacao <= 75) {
                $cor = $coresPadrao[2];
            } else {
                $cor = $coresPadrao[3];
            }

            $todosCenariosPontuacao[] = [
                'name' => $cenario->nome,
                'id' => $cenario->id,
                'y' => $cenario->pontuacao,
                'color' => $cor,
                'drilldown' => 'd' . $cenario->id,
                'tipo' => 'cenario',
                'dataLabels' => true,
            ];

            $r = 1;
            $riscos = $cenario->getRiscos()->where('status=1')->all();

            $todosCenarios[$cenario->id]['nome'] = $cenario->nome;
            $todosCenarios[$cenario->id]['coleta'] = $cenario->coleta_vinculo . ' - ' . $cenario->coletaVinculo->nome;
            $todosCenarios[$cenario->id]['coleta-nome'] = $cenario->coletaVinculo->nome;
            $todosCenarios[$cenario->id]['riscos'] = $riscos;
            $todosCenarios[$cenario->id]['matrizConsequenciaProbabilidade'] = $cenario->matrizConsequenciaProbabilidade;
            $dataRisco = [];
            $riscosConsequenciaProbabilidade = [];

            foreach ($riscos as $risco) {

                $riscosConsequenciaProbabilidade[] = [
                    'nome' => 'R' . $r . ' - ' . $risco->nome,
                    'consequencia' => $risco->consequencia_valor,
                    'probabilidade' => $risco->probabilidade,
                ];

                $pontuacaoRisco = round($risco->consequencia_valor * ($risco->probabilidade / 100));

                //$todosRiscos[$r]['name'] = 'R' . $r;
                $todosRiscos[$r]['name'] = 'R' . $r . ' - ' . $risco->nome;
                $todosRiscos[$r]['type'] = 'line';
                $todosRiscos[$r]['data'][] = $pontuacaoRisco;
                $todosRiscos[$r]['tooltip']['valueSuffix'] = ' pts';
                $todosRiscos[$r]['dataLabels'] = false;

                if ($pontuacaoRisco > $maxPontuacaoRisco) {
                    $maxPontuacaoRisco = $pontuacaoRisco;
                }

                if ($risco->consequencia_descricao == 'Leve') {

                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[0];
                    } else {
                        $corRisco = $coresPadrao[0];
                    }
                } elseif ($risco->consequencia_descricao == 'Moderado') {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[1];
                    } else {
                        $corRisco = $coresPadrao[0];
                    }
                } elseif ($risco->consequencia_descricao == 'Grave') {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[1];
                    } else {
                        $corRisco = $coresPadrao[1];
                    }
                } else {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[3];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[2];
                    } else {
                        $corRisco = $coresPadrao[1];
                    }
                }


                $dataRisco[] = [
                    'name' => 'R' . $r,
                    'nameCompleto' => 'R' . $r . ' - ' . $risco->nome,
                    'id' => 'risco' . $risco->id,
                    'y' => $pontuacaoRisco,
                    'color' => $corRisco,
                    'tipo' => 'risco',
                    'consequencia' => $risco->consequencia_descricao,
                    'probabilidade' => $risco->probabilidade . '%',
                    'tooltip' => [
                        'formatter' => " function () { return 'Custom Format...'; }",
                    ],
                    'dataLabels' => true,
                ];

                $r++;
            }

            $todosCenariosDrilldrown[] = [
                'id' => 'd' . $cenario->id,
                'name' => $cenario->nome,
                'data' => $dataRisco,
                'pointWidth' => 50,
                //'pointWidth' => count($dataRisco) <= 1 ? 50 : 'null',
            ];

            $todosCenarios[$cenario->id]['riscosConsequenciaProbabilidade'] = $riscosConsequenciaProbabilidade;
        }


        $avisaPendencia = false;
        $botoes = false;
        $permiteEditar = false;

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

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


        $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);

        $analisesRegulatoriasContexto = \app\models\ContextoTemAnaliseRegulatoria::find()
            ->where(['contexto_id' => $contexto->id])
            ->all();

        $planoAcaos = PlanoAcao::find()
            ->where([
                'contexto_id' => $contexto->id,
                'status' => PlanoAcao::ATIVO,
            ])
            ->all();

        $licenciado = 0;
        if ($contexto->tipoLicenca == 'Licenciado') {
            $licenciado = 1;
        }

        $fluxoInventario = \app\models\InventarioResposta::percentualInventarioRespondido($contexto);
        $fluxoColeta = \app\modules\performance\models\Coleta::percentualColetaRespondido($contexto, $coletaReferencia);
        $fluxoRisco = \app\modules\risk\models\RiscoCenario::percentualRiscoRespondido($todosCenarios);
        $fluxoPlanoAcao = \app\modules\performance\models\PlanoAcao::percentualPlanoAcaoCriados($contexto, $coletaReferencia, $coletaReferenciaListaIndicacoresComprometedor);
        $fluxoDocsAdequacao = \app\modules\performance\models\ColetaIndicador::percentualDocsAdequacaoCriados($contexto, $coletaReferencia);

        //Utils::debug($fluxoRisco);


        $niveisValorGlobal = [];
        $niveisValorGlobal[] = ["from" => 0, "to" => 20, "color" => "#DF5353", "label" => "Comprometedor"];
        $niveisValorGlobal[] = ["from" => 20.01, "to" => 80, "color" => "#e8dd11", "label" => "Mercado"];
        $niveisValorGlobal[] = ["from" => 80.01, "to" => 100, "color" => "#089f50", "Excelência"];
        $plots = [];
        foreach ($niveisValorGlobal as $key => $v) {

            list($r, $g, $b) = sscanf($v['color'], "#%02x%02x%02x");
            $plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];
        }

        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $contexto->id,
                'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
            ])
            ->orderBy('prioridade ASC, id DESC')
            ->all();

        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

        return $this->render('lgpdv2_fora', [
            'aplicacao' => $aplicacao,
            'model' => $contexto,
            'parametrosLabel' => $parametrosLabel,
            'coletaReferencia' => $coletaReferencia,
            'totalColetas' => $totalColetas,
            'valorGlobal' => $valorGlobal,
            'coletaValores' => $coletaValores,
            'coletaNomes' => $coletaNomes,
            'coletasIdNome' => $coletasIdNome,
            'percentual' => $percentual,
            'evolucao' => $evolucao,
            'totalIndicadores' => $totalIndicadores,
            'totalIndicadoresDemandamAtencao' => $totalIndicadoresDemandamAtencao,
            'verticalPeriodicidade' => $verticalPeriodicidade,
            'coletaEstruturaPvfs' => $coletaEstruturaPvfs,
            'parametrosContexto' => $parametrosContexto,
            'coletaReferenciaIndicadores' => $coletaReferenciaIndicadores,
            'coletaReferenciaIndicacoresComprometedor' => $coletaReferenciaIndicacoresComprometedor,
            'percentualIndicadorComprometedor' => $percentualIndicadorComprometedor,
            'coletaReferenciaListaIndicacoresComprometedor' => $coletaReferenciaListaIndicacoresComprometedor,
            'coletaReferenciaIndicacoresMercado' => $coletaReferenciaIndicacoresMercado,
            'percentualIndicadorMercado' => $percentualIndicadorMercado,
            'coletaReferenciaListaIndicacoresMercado' => $coletaReferenciaListaIndicacoresMercado,
            'coletaReferenciaIndicacoresExcelencia' => $coletaReferenciaIndicacoresExcelencia,
            'percentualIndicadorExcelencia' => $percentualIndicadorExcelencia,
            'coletaReferenciaListaIndicacoresExcelencia' => $coletaReferenciaListaIndicacoresExcelencia,
            'verticeColetaReferencia' => $verticeColetaReferencia,
            'minProjeto' => $minProjeto,
            'maxProjeto' => $maxProjeto,
            'responsaveis' => [],
            'faixasPadrao' => $faixasPadrao,
            'plots' => $plots,
            'listaNomeIndicadores' => $listaNomeIndicadores,
            'listaValoresIndicadores' => $listaValoresIndicadores,
            'indicadorResponsavelOrdem' => [],
            'pareceresTecnicos' => $pareceresTecnicos,
            'anexos' => $anexos,
            'contatos' => $contatos,
            'docsExiste' => $docsExiste,
            'isCeon' => $isCeon,
            'coletaApoio' => $coletaApoio,
            'coletaApoioEstruturaPvf' => $coletaApoioEstruturaPvf,
            'coletaApoioValorGlobal' => $coletaApoioValorGlobal,
            'coletaApoioIndicacoresComprometedor' => $coletaApoioIndicacoresComprometedor,
            'coletaApoioIndicacoresMercado' => $coletaApoioIndicacoresMercado,
            'coletaApoioIndicacoresExcelencia' => $coletaApoioIndicacoresExcelencia,
            'coletaApoiolistaValoresIndicadores' => $coletaApoiolistaValoresIndicadores,
            'riscoCenario' => $riscoCenario,
            'dadosVerticalIndicadorResponsavel' => $dadosVerticalIndicadorResponsavel,
            'coletaplanoacao' => $coletaplanoacao,
            'vertical_indicador_id' => $vertical_indicador_id,
            'todosCenariosPontuacao' => $todosCenariosPontuacao,
            'todosCenarios' => $todosCenarios,
            'todosRiscos' => $todosRiscos,
            'todosCenariosDrilldrown' => $todosCenariosDrilldrown,
            'riscosCategorias' => $riscosCategorias,
            'cores' => $cores,
            'coresPadrao' => $coresPadrao,
            'avisaPendencia' => $avisaPendencia,
            'botoes' => $botoes,
            'origem' => 'contexto',
            'permiteEditar' => $permiteEditar,
            'ultimasAtualizacoes' => $ultimasAtualizacoes,
            'organograma' => $organograma,
            'totalNotificacoes' => $totalNotificacoes,
            'analisesRegulatoriasContexto' => $analisesRegulatoriasContexto,
            'planoAcaos' => $planoAcaos,
            'licenciado' => $licenciado,
            'totalGB' => $totalGB,
            'percentualDisco' => $percentualDisco,
            'bgDisco' => $bgDisco,
            'fluxoInventario' => $fluxoInventario,
            'fluxoColeta' => $fluxoColeta,
            'fluxoPlanoAcao' => $fluxoPlanoAcao,
            'fluxoDocsAdequacao' => $fluxoDocsAdequacao,
            'fluxoRisco' => $fluxoRisco,
            'recomendacoesSeguranca' => $recomendacoesSeguranca,
            'prioridades' => $prioridades,
            'processoScopes' => [],
            'legislacaoCorrespondentes' => [],
            'anexoArvore' => json_encode([]),
            'token' => $token,
        ]);
    }

    public function actionDadosAreaPreocupacaoToken($token, $pai, $coleta, $vertice, $destino, $id = null)
    {

        if ($token != "lGRUQrMvnCTzF8ovZrSRaz5bk3wuAlGRUQrMvnCTzF8ovZrSRaz5bk3wuA") {
            return "Erro 1";
        }

        $retorno = [];

        $coleta = Coleta::findOne($coleta);

        if ($coleta) {
            $faixasPadrao = $coleta->faixasPadrao;
        } else {
            $faixasPadrao = [];
        }

        $faixasPadrao = [];
        $faixasPadrao[] = ["from" => -1000, "to" => 20, "color" => "#DF5353", "label" => "Comprometedor"];
        $faixasPadrao[] = ["from" => 20.01, "to" => 80, "color" => "#e8dd11", "label" => "Mercado"];
        $faixasPadrao[] = ["from" => 80.01, "to" => 1000, "color" => "#089f50", "Excelência"];


        $min = 0;
        $max = 0;
        foreach ($faixasPadrao as $key => $v) {
            if ($v["from"] < $min) {
                $min = $v["from"];
            }
            if ($v["to"] > $max) {
                $max = $v["to"];
            }
        }

        if ($vertice == 1) {

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

            if ($coletaEstrutura) {

                $pontuacao = $coletaEstrutura->pontuacao;

                $cor = 'rgba(38,105,154,0.9)';
                foreach ($faixasPadrao as $key => $v) {
                    if ($pontuacao >= (int) $v["from"] && $pontuacao < (int) $v["to"]) {
                        $cor = $v["color"];
                    }
                }

                if ($pontuacao >= $max) {
                    $cor = 'rgba(38,105,154,0.9)';
                }
                if ($pontuacao <= $min) {
                    $cor = 'rgba(224,90,90,0.9)';
                }


                if ($pontuacao >= $max) {
                    $cor = '#DF5353';
                }
                if ($pontuacao <= $min) {
                    $cor = '#089f50';
                }


                $data = [];

                $data[] = [
                    'id' => $coletaEstrutura->id,
                    'name' => 'Valor Global',
                    'y' => (int) $pontuacao,
                    'drilldown' => true,
                    'chave' => $coletaEstrutura->id,
                    'tipo' => 'estrutura',
                    'vertice' => 0,
                    'color' => $cor,
                    'pai' => $pai,
                ];

                $retorno = [
                    'name' => 'Pontuação',
                    'data' => $data,
                    'pointWidth' => 60,
                    //                    'borderRadiusTopLeft' => '20px',
                    //                    'borderRadiusTopRight' => '20px',
                    //                    'borderRadiusBottomLeft' => '20px',
                    //                    'borderRadiusBottomRight' => '20px',
                ];
            }
        } else {

            $coletaEstruturas = ColetaEstrutura::find()
                ->where([
                    'cod_pai' => $pai,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->asArray()
                ->all();

            $data = [];

            foreach ($coletaEstruturas as $coletaEstrutura) {

                $pontuacao = $coletaEstrutura['pontuacao'];

                $cor = 'rgba(38,105,154,0.9)';
                foreach ($faixasPadrao as $key => $v) {
                    if ($pontuacao >= (int) $v["from"] && $pontuacao < (int) $v["to"]) {
                        $cor = $v["color"];
                    }
                }

                if ($pontuacao >= $max) {
                    $cor = 'rgba(224,90,90,0.9)';
                }
                if ($pontuacao <= $min) {
                    $cor = 'rgba(38,105,154,0.9)';
                }


                if ($pontuacao >= $max) {
                    $cor = '#089f50';
                }
                if ($pontuacao <= $min) {
                    $cor = '#DF5353';
                }


                $data[] = [
                    'id' => $coletaEstrutura['id'],
                    'name' => $coletaEstrutura['nome'],
                    'y' => (int) $pontuacao,
                    'drilldown' => true,
                    'chave' => $coletaEstrutura['id'],
                    'tipo' => 'estrutura',
                    'vertice' => 0,
                    'color' => $cor,
                    'pai' => $pai,
                ];
            }

            if (!$coletaEstruturas) {
                $indicadores = ColetaIndicador::find()
                    ->where([
                        'estrutura_id' => $pai,
                        'status' => ColetaIndicador::ATIVO,
                    ])
                    ->asArray()
                    ->all();

                foreach ($indicadores as $indicador) {

                    $pontuacaoIndicador = (int) $indicador['pontuacao'] + 0;

                    $cor = '#089f50';
                    foreach ($faixasPadrao as $key => $v) {
                        if ($pontuacaoIndicador >= (int) $v["from"] && $pontuacaoIndicador < (int) $v["to"]) {
                            $cor = $v["color"];
                        }
                    }

                    $cor = 'rgba(38,105,154,0.9)';

                    if ($pontuacaoIndicador >= $max) {
                        $cor = 'rgba(224,90,90,0.9)';
                    }
                    if ($pontuacaoIndicador <= $min) {
                        $cor = 'rgba(38,105,154,0.9)';
                    }



                    foreach ($faixasPadrao as $key => $v) {
                        if ($pontuacaoIndicador >= (int) $v["from"] && $pontuacaoIndicador < (int) $v["to"]) {
                            $cor = $v["color"];
                        }
                    }


                    $data[] = [
                        'name' => $indicador['nome'],
                        'y' => (int) $pontuacaoIndicador,
                        'drilldown' => false,
                        'chave' => $indicador['id'],
                        'tipo' => 'indicador',
                        'vertice' => 0,
                        'color' => $cor,
                        'pai' => $pai,
                    ];
                }
            }


            if ($destino == 1) {
                $qtdeEstruturas = count($data);
                if ($qtdeEstruturas > 5) {
                    $tamanho = null;
                } else {
                    $tamanho = 60;
                }
            } else {
                $tamanho = null;
            }

            $retorno = [
                'name' => 'Pontuação',
                'data' => $data,
                'pai' => $pai,
            ];

            if ($tamanho) {
                $retorno['pointWidth'] = $tamanho;
            }
        }

        return json_encode($retorno);
    }

    public function actionDuplica($contexto_id, $aplicacao_id, $origem = null)
    {

        //falta aplicacao
        //falta modulos
        //não gerou coleta de referencia corretamente
        //colocou coleta de referencia em projeto errado
        //não gerou cenario de risco

        \app\models\Base::loga("Acessou a duplicação de Contexto", $_GET, $_POST, 49, $contexto_id);
        $contextoOrigem = Contexto::find()
            ->where([
                'id' => $contexto_id,
                'active' => Contexto::ATIVO,
            ])
            ->one();
        if (!$contextoOrigem) {
            return '<div class="alert alert-danger">Erro! Cliente não encontrado!</div>';
        }
        if (!$contextoOrigem->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::filterMyContextosAnaliseTecnica()
            ->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");
        }
        $model = new Licenca();
        $model->status = Licenca::LIBERADO;
        $model->cliente_id = $contextoOrigem->cliente_id;
        $contexto = new Contexto();


        $aplicacaoTemProjeto = AplicacaoTemProjeto::find()->where(['aplicacao_id' => $aplicacao_id])->one();
        if (!$aplicacaoTemProjeto) {
            throw new HttpException(500, "Erro P1-A, entre em contato com o suporte");
        }

        $projeto = Projeto::findOne($aplicacaoTemProjeto->projeto_id);


        if (!$projeto) {
            throw new HttpException(500, "Erro P1, entre em contato com o suporte");
        }
        $licencaOrigem = Licenca::find()
            ->where([
                'contexto_id' => $contextoOrigem->id,
            ])
            ->one();
        if (!$licencaOrigem) {
            throw new HttpException(500, "Erro P5, entre em contato com o suporte");
        }
        $transaction = Yii::$app->db->beginTransaction();
        $msgErro = '';
        try {
            $valid = true;
            $model->valor = $licencaOrigem->valor;
            $model->forma_pagamento = $licencaOrigem->forma_pagamento;
            $model->criado_por = Yii::$app->user->identity->id ?? null;
            $model->criado_em = date('Y-m-d H:i:s');
            $referencia = $model->cliente_id . '-' . time();
            $model->referencia = $referencia;
            if (!$model->save()) {
                $valid = false;
                $msgErro .= json_encode($model->getErrors());
            }
            $contexto->load(Yii::$app->request->post());
            $contexto->name = $contextoOrigem->name . '(duplicado)';
            $contexto->natureza = 'Eletrobras';
            $contexto->active = Contexto::ATIVO;
            $contexto->cliente_id = $model->cliente_id;
            $contexto->created_at = date('Y-m-d H:i:s');
            $contexto->cadastrado_por = Yii::$app->user->identity->id ?? null;
            $contexto->cota_disco = Contexto::COTA_PADRAO;
            $contexto->contexto_natureza_id = $contextoOrigem->contexto_natureza_id;
            // $contexto->file = \yii\web\UploadedFile::getInstance($contexto, 'file');
            //if ($contexto->file) {
            //    $contexto->foto = md5(date('Ymd') . $contexto->file->name) . '.' . $contexto->file->extension;
            //    if (!$contexto->upload()) {
            //        throw new HttpException(500, "Erro ao salvar a foto, motivo: " . json_encode($contexto->getErrors()));
            //    }
            //} 
            if ($valid) {
                if (!$contexto->makeRoot()) {
                    $valid = false;
                    $msgErro .= '1 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors());
                } else {
                    \app\models\Base::loga("Criou o Cliente", $_GET, $_POST, 2, $contexto->id);
                }
            }
            if ($valid) {
                $model->contexto_id = $contexto->id;
                if (!$model->save()) {
                    $valid = false;
                    $msgErro .= '2 - Erro ao salvar a Licença, motivo: ' . json_encode($model->getErrors());
                }
            }
            if ($valid) {
                $projeto->contextos = $projeto->contextos . ',' . $contexto->id;
                if (!$projeto->save()) {
                    $valid = false;
                    $msgErro .= '3 - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors());
                }
            }
            if ($valid) {
                $verticalId = null;
                $projetoTemVertical = \app\modules\performance\models\ProjetoTemVertical::find()
                    ->where(['projeto_id' => $projeto->id])
                    ->one();
                if ($projetoTemVertical) {
                    $verticalId = $projetoTemVertical->vertical_id;
                }
                $nome = date('d/m/Y');
                $coleta = \app\modules\performance\models\Coleta::geraColetaGenerica($nome, $verticalId, $projeto->id, $contexto->id, \Yii::$app->user->identity->id);
                if (!$coleta) {
                    $valid = false;
                    $msgErro .= "4 - Erro ao criar a coleta, motivo: " . json_encode($coleta);
                }
            }
            if ($valid) {
                $geraArvore = \app\modules\performance\models\AnexoArvore::geraArvorePadrao($contexto);
                if (!$geraArvore) {
                    $msgErro = $geraArvore;
                }
            }
            $scopes = Scope::find()
                ->where([
                    'contexto_id' => $contextoOrigem->id,
                ])
                ->all();
            $deParaScopes = [];
            $scopesAtualizar = [];
            foreach ($scopes as $scope) {
                $scopeNovo = new Scope();
                $scopeNovo->type = $scope->type;
                $scopeNovo->name = $scope->name;
                $scopeNovo->parent_id = $scope->parent_id;
                $scopeNovo->root = $scope->root;
                $scopeNovo->status = Scope::ATIVO;
                $scopeNovo->cliente_id = $scope->cliente_id;
                $scopeNovo->contexto_id = $contexto->id;
                $scopeNovo->respondido_por = $scope->respondido_por;
                $scopeNovo->respondido_email = $scope->respondido_email;
                $scopeNovo->token = Yii::$app->security->generateRandomString(250);
                $scopeNovo->geral_especifico = $scope->geral_especifico;
                $scopeNovo->responde_inventario = $scope->responde_inventario;
                if (!$scopeNovo->save()) {
                    throw new HttpException(500, json_encode($scopeNovo->getErrors()));
                }
                $deParaScopes[$scope->id] = $scopeNovo->id;
                $scopesAtualizar[] = $scopeNovo;
                $inventarioScopeOrigens = InventarioScope::find()
                    ->where([
                        'scope_id' => $scope->id,
                        'status' => InventarioScope::ATIVO,
                    ])
                    ->all();
                //Utils::debug([$scopeNovo, $inventarioScopeOrigens]);
                foreach ($inventarioScopeOrigens as $inventarioScopeOrigem) {
                    //Utils::debug([$scopeNovo, $inventarioScopeOrigem]);
                    $duplicaIventarioScope = InventarioScope::duplica($inventarioScopeOrigem, $inventarioScopeOrigem, $scopeNovo);
                }
            }

            if ($valid) {
                $contextoTemModulos = ContextoTemModulo::find()->where(['contexto_id' => $contextoOrigem->id])->all();

                foreach ($contextoTemModulos as $contextoTemModulo) {

                    $novoContextoTemModulo = new ContextoTemModulo();
                    $novoContextoTemModulo->contexto_id = $contexto->id;
                    $novoContextoTemModulo->modulo = $contextoTemModulo->modulo;

                    if (!$novoContextoTemModulo->save()) {
                        $valid = false;
                        $msgErro = 'Erro ao salvar o módulo, motivo: ' . json_encode($novoContextoTemModulo->getErrors());
                    }
                }
            }

            if ($valid) {
                Yii::$app->mailer->compose('_nova_licenca_audisa', [
                    'contexto' => $contexto,
                    'licenca' => $model,
                ])
                    ->setFrom(['no-reply@krinom.com.br' => 'Accia'])
                    ->setTo(['gledson@krinom.com.br', 'simone.pereira@krinom.com.br'])
                    ->setBcc(['gledson@krinom.com.br'])
                    ->setSubject('Nova Licença ' . getenv('NOME_PLATAFORMA'))
                    ->send();
            }
            if ($valid) {
                //                      desabilitado temporariamente - aguardando template                    
                //                    if ($contexto->contato_principal_email) {
                //                        Yii::$app->mailer->compose('_bemvindocontato', [
                //                                    'contexto' => $contexto,
                //                                ])
                //                                ->setFrom('no-reply@krinom.com.br')
                //                                ->setTo($contexto->contato_principal_email)
                //                                ->setBcc(['gledson@krinom.com.br'])
                //                                ->setSubject('Bem-vindo a AUDISA!')
                //                                ->attach(\Yii::getAlias('@webroot') . '/uploads/1.01.1. Email-Cust_Inicial.docx')
                //                                ->attach(\Yii::getAlias('@webroot') . '/uploads/1.01.2. Analise_Regulatoria.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot') . '/uploads/1.01.3. Dimensionamento.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot') . '/uploads/1.01.4. Responsavel.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot') . '/uploads/1.01.5. DPO.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot') . '/uploads/1.01.6. Comite.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot') . '/uploads/1.01.7. Certificações.xlsx')
                //                                ->send();
                //                    }
            }
            //                if ($model->parceiro_id && $valid) {
            //                    $valid = Licenca::distribuiComissao($model);
            //                }
            if ($valid) {
                foreach ($scopesAtualizar as $scopeAtualizar) {
                    $scopeAtualizar->root = $deParaScopes[$scopeAtualizar->root];
                    if ($scopeAtualizar->parent_id) {
                        $scopeAtualizar->parent_id = $deParaScopes[$scopeAtualizar->parent_id];
                    }
                    if (!$scopeAtualizar->save()) {
                        throw new HttpException(500, json_encode($scopeAtualizar->getErrors()));
                    }
                }
            }

            if ($valid) {
                $transaction->commit();
            } else {
                $transaction->rollBack();
                throw new HttpException(500, $msgErro);
            }
            //Utils::debug($deParaScopes);
            if ($valid) {
                if ($origem == 'aplicacao') {
                    return $this->redirect(['/performance/aplicacao/lgpd', 'id' => $aplicacao_id]);
                }

                return $this->redirect(['/performance/cliente/view', 'id' => $contextoOrigem->cliente_id]);
            }
        } catch (\Exception $exception) {
            $transaction->rollBack();
            //Utils::debug($exception->getMessage());
            throw new HttpException(500, $exception->getMessage());
        }
    }

    public function actionPesquisaApontamento($coleta_indicador_id, $contexto_id, $aplicacao_id)
    {

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

        $coletas = Coleta::find()
            ->select('id')
            ->where([
                'contexto_id' => $coletaIndicador->estrutura->coleta->contexto_id,
                'status' => Coleta::ATIVO,
            ])
            ->column();

        $indicadores = ColetaIndicador::find()
            ->select('coleta_indicador.id')
            ->joinWith('estrutura')
            ->join('LEFT JOIN', 'coleta', 'coleta_estrutura.coleta_id=coleta.id')
            ->where([
                'coleta_indicador.vertical_indicador_id' => $coletaIndicador->vertical_indicador_id,
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
            ])
            ->andWhere(['in', 'coleta.id', $coletas])
            ->column();

        $apontamentos = Apontamento::find()
            ->where([
                'status' => Apontamento::ATIVO,
            ])
            ->andWhere(['in', 'coleta_indicador_id', $indicadores])
            ->all();

        $hr = false;

        $retorno = '';

        foreach ($apontamentos as $apontamento) {

            $d = explode(" ", $apontamento->created_at);

            if ($hr) {
                $retorno .= '<hr />';
            }

            $retorno .= '<div class="row mt-3">';
            $retorno .= '<div class="col-lg-10">';
            $retorno .= '<label>' . $apontamento->titulo . '</label><br />';
            $retorno .= $apontamento->apontamento;
            $retorno .= '</div>';
            $retorno .= '<div class="col-lg-2" style="text-align:right"><a href="/performance/contexto/apontamento-update?id=' . $apontamento->id . '&contexto_id=' . $contexto_id . '&aplicacao_id=' . $aplicacao_id . '" style="font-size: 0.8em; color:gray; text-decoration:none">Editar</a></div>';
            $retorno .= '</div>';
            $retorno .= '<div class="row">';
            $retorno .= '<div class="col-lg-12" style="text-align:right">';
            $retorno .= '<div style="font-size: 0.8em;"> ' . $apontamento->createdBy->name . ' em ' . $d[0] . '</div>';
            $retorno .= '</div>';
            $retorno .= '</div>';

            $hr = true;
        }


        return $retorno;
    }

    public function actionApontamentoCreate($coleta_indicador_id, $contexto_id, $aplicacao_id)
    {

        $model = new Apontamento();

        $model->coleta_indicador_id = $coleta_indicador_id;

        $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()) && $model->save()) {
            return $this->redirect(['/performance/contexto/view', 'id' => $contexto_id, 'aplicacao_id' => $aplicacao_id]);
        }

        \app\models\Base::loga("Acessou a criação de Apontamento", $_GET, $_POST, 2);

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

    public function actionApontamentoUpdate($id, $contexto_id, $aplicacao_id)
    {

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

        if (!$model) {
            throw new HttpException(404, 'Apontamento não encontrado');
        }

        $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()) && $model->save()) {
            return $this->redirect(['/performance/contexto/view', 'id' => $contexto_id, 'aplicacao_id' => $aplicacao_id]);
        }

        \app\models\Base::loga("Acessou a atualização de Apontamento", $_GET, $_POST, 2);

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

    public function actionCreateGestor($cliente_id)
    {

        \app\models\Base::loga("Cadastrou um novo Contexto (Cliente na LGPD)", $_GET, $_POST, 35);

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

        $licenca = new \app\models\Licenca();
        $licenca->status = Licenca::LIBERADO;
        $licenca->valor = str_replace(",", ".", \app\models\Licenca::VALOR_PADRAO);
        $msgErro = '';
        $contexto = new Contexto();
        $contexto->natureza = 'Accia';

        $parceriaGpslgpd = false;

        $cliente = Cliente::find()
            ->join('LEFT JOIN', 'user_has_resource', 'cliente.id = user_has_resource.resource_id')
            ->where([
                'cliente.id' => $cliente_id,
                'cliente.status' => Cliente::ATIVO,
            ])
            ->one();

        if (!$cliente) {
            throw new HttpException(500, "Escritório não encontrado");
        }

        $clienteTemModulos = ClienteTemModulo::find()
            ->select('modulo')
            ->where(['cliente_id' => $cliente->id])
            ->column();

        $modulos = [];
        $modulosPossiveis = ClienteTemModulo::LISTA_MODULOS;
        foreach ($modulosPossiveis as $k => $modulosPossivel) {
            if (in_array($k, $clienteTemModulos)) {
                $modulos[$k] = $modulosPossivel;
            }
        }

        $listaModulosCliente = $modulos;

        $projeto = new Projeto();
        $projeto->nome = Projeto::NOME_PADRAO_LGPD;
        $projeto->cliente_id = $cliente->id;
        $projeto->contextos = null;
        $projeto->ordem = 1;
        $projeto->coleta_necessita_homologacao = 0;
        $projeto->created_by = \Yii::$app->user->identity->id ?? null;
        $projeto->status = Projeto::ATIVO;
        $projeto->created_at = date('Y-m-d H:i:s');

        if (!$projeto->save()) {
            //Utils::debug(microtime());
            foreach ($projeto->getErrors() as $key => $value) {
                foreach ($value as $chave => $erro) {
                    $msgErro .= $erro . '<br />';
                }
            }
            throw new HttpException(500, "1 - Erro: " . $msgErro);
        }

        $verticais = [];
        $verticaisAtivas = Vertical::find()->where(['status' => Vertical::ATIVO])->all();
        foreach ($verticaisAtivas as $k => $verticaisAtiva) {
            $verticais[$verticaisAtiva->id] = $verticaisAtiva->nome;
        }

        $projetoTemVertical = new ProjetoTemVertical();
        $projetoTemVertical->projeto_id = $projeto->id;
        $projetoTemVertical->vertical_id = Vertical::PADRAO_LGPD;
        $projetoTemVertical->ordem = 1;
        $projetoTemVertical->status = ProjetoTemVertical::ATIVO;

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

            foreach ($projetoTemVertical->getErrors() as $key => $value) {
                foreach ($value as $chave => $erro) {
                    $msgErro .= $erro . '<br />';
                }
            }
            throw new HttpException(500, "2 - Erro: " . $msgErro);
        }

        $connectors = Projeto::CONNECTORS;

        $contextoTemModeloRisco = new ContextoTemModeloRisco();

        $riscosModelosLista = [];
        $riscoModelos =  RiscoModelo::find()
            ->where([
                'status' => RiscoModelo::ATIVO,
            ])
            ->all();
        foreach ($riscoModelos as $riscoModelo) {
            if ($riscoModelo->verticalVinculo->status == Vertical::ATIVO) {
                $riscosModelosLista[$riscoModelo->id] = $riscoModelo->nome;
            }
        }

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

            $transaction = Yii::$app->db->beginTransaction();

            try {

                $contexto->active = Contexto::ATIVO;
                $contexto->cliente_id = $cliente->id;
                $contexto->created_at = date('Y-m-d H:i:s');
                $contexto->cadastrado_por = Yii::$app->user->identity->id ?? null;
                $contexto->cota_disco = Contexto::COTA_PADRAO;

                $contexto->file = UploadedFile::getInstance($contexto, 'file');

                if (!$contexto->makeRoot()) {
                    throw new HttpException(500, '4 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                } else {

                    $contexto->logoFile = UploadedFile::getInstance($contexto, 'file');

                    if ($contexto->logoFile) {
                        $contexto->foto = md5(date('Ymd') . $contexto->logoFile->name) . '.' . $contexto->logoFile->extension;
                        if (!$contexto->upload()) {
                            throw new HttpException(500, "3 - Erro ao salvar a foto, motivo: " . json_encode($contexto->getErrors()));
                        }
                        if (!$contexto->save()) {
                            throw new HttpException(500, '14 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                        }
                    }

                    \app\models\Base::loga("Criou o Cliente", $_GET, $_POST, 2, $contexto->id);
                }

                $contextoTemModeloRisco->load(Yii::$app->request->post());
                $contextoTemModeloRisco->contexto_id = $contexto->id;
                if (!$contextoTemModeloRisco->save()) {
                    throw new HttpException(500, '5a - Erro ao salvar o Modelo de Risco, motivo: ' . json_encode($contextoTemModeloRisco->getErrors()));
                }

                $projeto->codigo_pos_coleta = $projeto->projetoCodigoPosColetaOriginal;

                $projeto->load(Yii::$app->request->post());

                if (isset($connectors[$projeto->codigo_pos_coleta])) {
                    $projeto->codigo_pos_coleta = (string) $connectors[$projeto->codigo_pos_coleta];
                } else {
                    $projeto->codigo_pos_coleta = null;
                }

                $projeto->contextos = $projeto->contextos . ',' . $contexto->id;
                if (!$projeto->save()) {
                    throw new HttpException(500, '5 - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors()));
                }

                $licenca->load(Yii::$app->request->post());
                $licenca->criado_por = Yii::$app->user->identity->id ?? null;
                $licenca->criado_em = date('Y-m-d H:i:s');
                $licenca->forma_pagamento = \app\models\Licenca::FORMA_PAGSEGURO;
                $licenca->cliente_id = $cliente->id ?? null;
                $licenca->contexto_id = $contexto->id;
                $licenca->valor = str_replace(",", ".", str_replace(".", ",", str_replace(".", "", $licenca->valor)));
                $referencia = $licenca->cliente_id . '-' . time();
                $licenca->referencia = $referencia;

                if (!$licenca->save()) {
                    throw new HttpException(500, "6 - Erro licença: " . json_encode($licenca->getErrors()));
                }


                $projetoTemVertical->load(Yii::$app->request->post());

                if (!$projetoTemVertical->save()) {
                    throw new HttpException(500, "7 - Erro ao salvar a vertical no projeto, motivo: " . json_encode($projetoTemVertical->getErrors()));
                }


                $faixasPadrao = [];
                $faixasPadrao[] = ['de' => 0, 'ate' => 20, 'cor' => '#df5353'];
                $faixasPadrao[] = ['de' => 20.01, 'ate' => 80, 'cor' => '#e8dd11'];
                $faixasPadrao[] = ['de' => 80.01, 'ate' => 100, 'cor' => '#089f50'];

                foreach ($faixasPadrao as $key => $value) {

                    $projetoTemFaixa = new \app\modules\performance\models\ProjetoTemFaixa();
                    $projetoTemFaixa->projeto_id = $projeto->id;
                    $projetoTemFaixa->de = $value['de'];
                    $projetoTemFaixa->ate = $value['ate'];
                    $projetoTemFaixa->cor = $value['cor'];
                    $projetoTemFaixa->created_at = date('Y-m-d H:i:s');
                    $projetoTemFaixa->created_by = \Yii::$app->user->identity->id ?? null;

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

                        $valid = false;
                        foreach ($projetoTemFaixa->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        throw new HttpException(500, "8 - Erro: " . $msgErro);
                    }
                }


                $aplicacao = Aplicacao::find()
                    ->joinWith(['unidadeNegocio'])
                    ->where([
                        'unidade_negocio.cliente_id' => $contexto->cliente_id,
                        'aplicacao.status' => Aplicacao::ATIVO,
                    ])
                    ->one();

                if (!$aplicacao) {
                    throw new HttpException(500, "8 - Aplicação não encontrada");
                }

                $aplicacaoTemProjeto = new \app\modules\performance\models\AplicacaoTemProjeto();
                $aplicacaoTemProjeto->aplicacao_id = $aplicacao->id;
                $aplicacaoTemProjeto->projeto_id = $projeto->id;

                if (!$aplicacaoTemProjeto->save()) {
                    foreach ($aplicacaoTemProjeto->getErrors() as $key => $value) {
                        foreach ($value as $chave => $erro) {
                            $msgErro .= $erro . '<br />';
                        }
                    }
                    throw new HttpException(500, "9 - Erro: " . $msgErro);
                }

                $verticalId = null;

                $projetoTemVertical = \app\modules\performance\models\ProjetoTemVertical::find()
                    ->where(['projeto_id' => $projeto->id])
                    ->one();

                if ($projetoTemVertical) {
                    $verticalId = $projetoTemVertical->vertical_id;
                }

                if ($verticalId == Vertical::ID_INSTALACOES_CORPORATIVAS) {
                    $geraOrganograma = \app\models\Scope::geraOrganogramaInstalacoesCorporativas($contexto, $verticalId);
                    if (!$geraOrganograma) {
                        throw new HttpException(500, "12 - Erro (instalações corporativas): " . $geraOrganograma);
                    }
                }

                if ($verticalId == Vertical::ID_SE_UHE_UEO) {
                    $geraOrganograma = \app\models\Scope::geraOrganogramaSeUheUeo($contexto, $verticalId);
                    if (!$geraOrganograma) {
                        throw new HttpException(500, "12 - Erro (instalações corporativas): " . $geraOrganograma);
                    }
                }

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


                $coleta = \app\modules\performance\models\Coleta::geraColetaGenericaInicial($nome, $verticalId, $projeto->id, $contexto->id, \Yii::$app->user->identity->id, null);

                if (!$coleta) {
                    throw new HttpException(500, "10 - Erro ao criar a coleta, motivo: " . json_encode($coleta));
                }

                $geraArvore = \app\modules\performance\models\AnexoArvore::geraArvorePadrao($contexto);
                if (!$geraArvore) {
                    throw new HttpException(500, "11 - Erro: " . $geraArvore);
                }

                foreach ($contexto->modulos as $modulo) {
                    $contextoTemModulo = new ContextoTemModulo();
                    $contextoTemModulo->contexto_id = $contexto->id;
                    $contextoTemModulo->modulo = $modulo;

                    if (!$contextoTemModulo->save()) {
                        $valid = false;
                        foreach ($contextoTemModulo->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        throw new HttpException(500, "13 - Erro: " . $msgErro);
                    }
                }


                $transaction->commit();

                return $this->redirect(['/performance/default/gestor', 'tab' => $cliente_id])->send();
            } catch (Exception $exception) {
                $transaction->rollBack();
                // Utils::debug($exception);
                throw new HttpException(500, $exception->getMessage());
            }
        }

        $listaConnectors = Projeto::CONNECTORS_LISTA;

        $contextoNaturezas = ArrayHelper::map(
            ContextoNatureza::find()
                ->where([
                    'status' => ContextoNatureza::ATIVO,
                ])
                ->all(),
            'id',
            'nome'
        );

        // Utils::debug($verticais);
        return $this->render('create', [
            'cliente' => $cliente,
            'contexto' => $contexto,
            'licenca' => $licenca,
            'providerCupom' => [],
            'parceriaGpslgpd' => $parceriaGpslgpd,
            'modulos' => $modulos,
            'listaModulosCliente' => $listaModulosCliente,
            'verticais' => $verticais,
            'projetoTemVertical' => $projetoTemVertical,
            'projeto' => $projeto,
            'listaConnectors' => $listaConnectors,
            'contextoTemModeloRisco' => $contextoTemModeloRisco,
            'riscosModelosLista' => $riscosModelosLista,
            'contextoNaturezas' => $contextoNaturezas,
        ]);
    }

    public function actionUpdateGestor($id, $aplicacao_id, $tab, $destino = 'principal')
    {

        \app\models\Base::loga("Acessou a atualização de Contexto", $_GET, $_POST, 49, $id);

        $contexto = Contexto::find()
            ->where([
                'id' => $id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

        if (!$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::filterMyContextosAnaliseTecnica()
            ->query
            ->select('contexto.id')
            ->andWhere('rgt-lft=1')
            ->andwhere(['=', 'contexto.id', $id])
            ->column();

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


        $userAdvogado = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
            ->where([
                'profile.cliente_id' => $contexto->cliente_id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->all(), 'id', 'name');

        $userResponsavel = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere(['=', 'user_has_resource.role', UserHasResource::NV_CP_CLIENTE_ADM])
            ->andWhere(['=', 'user_has_resource.resource_id', $contexto->cliente_id])
            ->all(), 'id', 'name');


        $userAdmin =  ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'auth_assignment', 'user_ceon.id=auth_assignment.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere([
                'OR',
                ['=', 'auth_assignment.item_name', 'Admin'],
                ['=', 'auth_assignment.item_name', 'Admininistrador'],
            ])
            ->all(), 'id', 'name');

        $advogado = array_replace_recursive($userAdvogado, $userResponsavel, $userAdmin);

        $contexto->lgpdAdvogado = User::find()
            ->select('user_ceon.id as id')
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'user_has_resource.role' => UserHasResource::NV_CP_CONTEXTO_ADM,
                'user_has_resource.resource_id' => $id,
                'user_ceon.status' => User::STATUS_ACTIVE,
            ])
            ->column();


        $advogadoExiste = $contexto->lgpdAdvogado;

        $usuarios = User::find()
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'user_has_resource.role' => UserHasResource::NV_CP_CONTEXTO_VIEW,
                'user_has_resource.resource_id' => $id,
                'user_ceon.status' => User::STATUS_ACTIVE,
            ])
            ->all();

        $quantidadeUsuarios = count($usuarios);

        if (!$usuarios) {
            $usuarios = [new \app\models\User()];
        }

        $msgErro = '';

        $verticais = [];
        $verticaisAtivas = Vertical::find()->where(['status' => Vertical::ATIVO])->all();
        foreach ($verticaisAtivas as $k => $verticaisAtiva) {
            $verticais[$verticaisAtiva->id] = $verticaisAtiva->nome;
        }

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

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

        $projeto->projetoCodigoPosColetaOriginal = $projeto->codigo_pos_coleta;

        foreach (Projeto::CONNECTORS as $c => $l) {
            if ($projeto->codigo_pos_coleta == $l) {
                $projeto->codigo_pos_coleta = $c;
                break;
            }
        }

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

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

        $connectors = Projeto::CONNECTORS;

        $contextoTemModeloRisco = ContextoTemModeloRisco::find()->where(['contexto_id' => $contexto->id])->one();

        if (!$contextoTemModeloRisco) {
            $contextoTemModeloRisco = new ContextoTemModeloRisco();
        }

        $riscosModelosLista = [];
        $riscoModelos =  RiscoModelo::find()
            ->where([
                'status' => RiscoModelo::ATIVO,
            ])
            ->all();
        foreach ($riscoModelos as $riscoModelo) {
            if ($riscoModelo->verticalVinculo->status == Vertical::ATIVO) {
                $riscosModelosLista[$riscoModelo->id] = $riscoModelo->nome;
            }
        }

        $licenca = Licenca::find()->where(['contexto_id' => $contexto->id])->one();

        if (!$licenca) {
            throw new HttpException(500, "Licença não encontrada");
        }

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

            $transaction = Yii::$app->db->beginTransaction();

            try {
                $valid = true;

                $contexto->logoFile = UploadedFile::getInstance($contexto, 'logoFile');

                if ($contexto->logoFile) {

                    $contexto->foto = md5(date('Ymd') . $contexto->logoFile->name) . '.' . $contexto->logoFile->extension;

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

                if (!$contexto->save()) {
                    $valid = false;
                    throw new HttpException(500, '1 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                }


                $contextoTemModeloRisco->load(Yii::$app->request->post());
                $contextoTemModeloRisco->contexto_id = $contexto->id;
                if (!$contextoTemModeloRisco->save()) {
                    throw new HttpException(500, '5a - Erro ao salvar o Modelo de Risco, motivo: ' . json_encode($contextoTemModeloRisco->getErrors()));
                }

                if ($valid) {

                    foreach ($advogadoExiste as $key) {

                        $removerRoles = [UserHasResource::NV_CP_CONTEXTO_ADM, UserHasResource::NV_CO_OPERADOR];

                        foreach ($removerRoles as $removerRole) {
                            $recursoAdv = UserHasResource::find()
                                ->where([
                                    'user_id' => $key,
                                    'role' => $removerRole,
                                    'resource_id' => $contexto->id
                                ])
                                ->one();

                            if ($recursoAdv) {
                                if (!$recursoAdv->delete()) {
                                    $valid = false;
                                    throw new HttpException(500, '3 - Erro ao remover o Advogado existente, motivo: ' . json_encode($recursoAdv->getErrors()));
                                }
                            }
                        }
                    }

                    if ($contexto->lgpdAdvogado) {

                        foreach ($contexto->lgpdAdvogado as $novoAdvogado) {

                            $rolesNovoAdvogado = array_keys(\Yii::$app->authManager->getRolesByUser($novoAdvogado));
                            if (!in_array(UserHasResource::NV_CP_CONTEXTO_ADM, $rolesNovoAdvogado)) {
                                $authManager = Yii::$app->authManager;
                                $authManager->assign($authManager->getRole(UserHasResource::NV_CP_CONTEXTO_ADM), $novoAdvogado);
                            }

                            if (!in_array(UserHasResource::NV_CR_CLIENTE_GESTOR, $rolesNovoAdvogado)) {
                                $authManager = Yii::$app->authManager;
                                $authManager->assign($authManager->getRole(UserHasResource::NV_CR_CLIENTE_GESTOR), $novoAdvogado);
                            }

                            if (!in_array(UserHasResource::NV_CO_OPERADOR, $rolesNovoAdvogado)) {
                                $authManager = Yii::$app->authManager;
                                $authManager->assign($authManager->getRole(UserHasResource::NV_CO_OPERADOR), $novoAdvogado);
                            }

                            $userHasResource = new UserHasResource();
                            $userHasResource->user_id = $novoAdvogado;
                            $userHasResource->role = UserHasResource::NV_CP_CONTEXTO_ADM;
                            $userHasResource->resource_id = (string) $contexto->id;
                            $userHasResource->param = 'role';
                            $userHasResource->value = 'Administrador';
                            if (!$userHasResource->save()) {
                                $valid = false;
                                throw new HttpException(500, '2- Erro ao adicionar o Advogado, motivo: ' . json_encode($userHasResource->getErrors()));
                            }

                            $novoAdvogadoTemRisco = UserHasResource::find()
                                ->where([
                                    'user_id' => $novoAdvogado,
                                    'role' => UserHasResource::NV_CR_CLIENTE_GESTOR,
                                    'resource_id' => $contexto->cliente_id,
                                ])
                                ->one();

                            if (!$novoAdvogadoTemRisco) {
                                $userHasResourceRisco = new UserHasResource();
                                $userHasResourceRisco->user_id = $novoAdvogado;
                                $userHasResourceRisco->role = UserHasResource::NV_CR_CLIENTE_GESTOR;
                                $userHasResourceRisco->resource_id = (string) $contexto->cliente_id;
                                $userHasResourceRisco->param = 'role';
                                $userHasResourceRisco->value = 'Administrador';
                                if (!$userHasResourceRisco->save()) {
                                    $valid = false;
                                    throw new HttpException(500, '2- Erro ao adicionar o Advogado, motivo: ' . json_encode($userHasResourceRisco->getErrors()));
                                }
                            }
                        }
                    }

                    $projeto->codigo_pos_coleta = $projeto->projetoCodigoPosColetaOriginal;

                    $projeto->load(Yii::$app->request->post());

                    if (isset($connectors[$projeto->codigo_pos_coleta])) {
                        $projeto->codigo_pos_coleta = (string) $connectors[$projeto->codigo_pos_coleta];
                    } else {
                        $projeto->codigo_pos_coleta = null;
                    }

                    $projeto->contextos = $projeto->contextos . ',' . $contexto->id;
                    if (!$projeto->save()) {
                        throw new HttpException(500, '5 - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors()));
                    }

                    $projetoTemVertical->load(Yii::$app->request->post());

                    if (!$projetoTemVertical->save()) {
                        throw new HttpException(500, "7 - Erro ao salvar a vertical no projeto, motivo: " . json_encode($projetoTemVertical->getErrors()));
                    }
                }

                if ($valid) {

                    $usuariosExiste = [];
                    foreach ($usuarios as $usuario) {
                        $usuariosExiste[] = $usuario->username;
                    }

                    $usuariosInserir = [];
                    if (isset($_POST['User'])) {
                        foreach ($_POST['User'] as $key => $row) {
                            $usernamenumber = str_replace("-", "", str_replace(".", "", $row['username']));
                            $usuariosInserir[] = $usernamenumber;
                        }
                    }

                    //excluir
                    foreach ($usuarios as $usuario) {

                        if ($valid) {
                            if (!in_array($usuario->username, $usuariosInserir)) {

                                User::excluirVisualizador($usuario->id, $contexto->id);
                            }
                        }
                    }
                    //inserir

                    if (isset($_POST['User'])) {
                        foreach ($_POST['User'] as $key => $row) {

                            if ($valid) {
                                $string = 'MarL31@' . Yii::$app->security->generateRandomString(6);
                                $usernamenumber = str_replace("-", "", str_replace(".", "", $row['username']));
                                if (!in_array($usernamenumber, $usuariosExiste)) {

                                    $usuarioJaCadastrado = false;
                                    $enviaEmail = false;

                                    if (isset($row['username'])) {
                                        $usuarioJaCadastrado = User::findOne(['username' => str_replace("-", "", str_replace(".", "", $row['username']))]);
                                    }

                                    if ($usuarioJaCadastrado) {
                                        $acesso = $usuarioJaCadastrado;
                                    } else {

                                        $enviaEmail = true;
                                        $acesso = new User();
                                        $acesso->username = $row['username'];
                                        $acesso->name = $row['name'];
                                        $acesso->email = $row['email'];
                                        $acesso->organization = $contexto->name;
                                        $acesso->password_raw = $string;
                                        $acesso->password_confirm = $string;
                                        $acesso->setPassword($acesso->password_raw);
                                        $acesso->generateAuthKey();

                                        if (!$acesso->save()) {
                                            $valid = false;
                                            throw new HttpException(500, '7 - Erro ao criar usuário de acesso do Cliente, motivo: ' . json_encode($acesso->getErrors()));
                                        }

                                        if ($valid) {
                                            $profileAcesso = new \app\models\Profile();
                                            $profileAcesso->user_id = $acesso->id;
                                            $profileAcesso->address = '...';
                                            $profileAcesso->city = '...';
                                            $profileAcesso->contact = '...';
                                            $profileAcesso->cliente_id = $contexto->cliente_id;

                                            if (!$profileAcesso->save()) {
                                                $valid = false;
                                                throw new HttpException(500, '8 - Erro ao criar o Profile do usuário de acesso do Cliente, motivo: ' . json_encode($profileAcesso->getErrors()));
                                            }
                                        }
                                    }


                                    if ($valid) {

                                        $authManager = Yii::$app->authManager;

                                        $roles = array_keys(\Yii::$app->authManager->getRolesByUser($acesso->id));

                                        if (!in_array(UserHasResource::NV_CP_CONTEXTO_VIEW, $roles)) {
                                            $authManager->assign($authManager->getRole(UserHasResource::NV_CP_CONTEXTO_VIEW), $acesso->id);
                                        }

                                        if (!in_array('Básico', $roles)) {
                                            $authManager->assign($authManager->getRole('Básico'), $acesso->id);
                                        }
                                    }

                                    if ($valid) {
                                        $userHasResourceAcesso = new UserHasResource();
                                        $userHasResourceAcesso->user_id = $acesso->id;
                                        $userHasResourceAcesso->role = UserHasResource::NV_CP_CONTEXTO_VIEW;
                                        $userHasResourceAcesso->resource_id = (string) $contexto->id ?? '';
                                        $userHasResourceAcesso->param = 'role';
                                        $userHasResourceAcesso->value = 'Administrador';
                                        if (!$userHasResourceAcesso->save()) {
                                            $valid = false;
                                            $msgErro .= '9 - Erro ao criar o acesso do Cliente, motivo: ' . json_encode($userHasResourceAcesso->getErrors());
                                        }
                                    }

                                    if ($valid) {
                                        if ($enviaEmail) {

                                            $dados = [];
                                            $dados['user'] = $acesso;
                                            $dados['profile'] = $acesso->profile;
                                            $dados['contexto'] = $contexto;
                                            $dados['string'] = $string;

                                            EmailTemplate::enviaEmail(EmailTemplate::TIPO_VISUALIZADOR_CONTEXTO, $dados, $acesso->email, 'Bem-vindo(a) ' . getenv('NOME_PLATAFORMA'));
                                        }
                                    }
                                }
                            }
                        }
                    }

                    //atualizar
                    if (isset($_POST['User'])) {
                        foreach ($_POST['User'] as $key => $row) {
                            if ($valid) {
                                $usernamenumber = str_replace("-", "", str_replace(".", "", $row['username']));
                                if (in_array($usernamenumber, $usuariosExiste)) {
                                    foreach ($usuarios as $usuario) {
                                        if ($valid) {
                                            if ($usuario->username == $usernamenumber) {
                                                $usuario->name = $row['name'];
                                                $usuario->email = $row['email'];
                                                if (!$usuario->save()) {
                                                    $valid = false;
                                                    throw new HttpException(500, '10 - Erro ao atualizar os dados do usuário do Cliente, motivo: ' . json_encode($usuario->getErrors()));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if ($valid) {

                    $scope = \app\models\Scope::find()
                        ->where([
                            'contexto_id' => $contexto->id,
                            'status' => \app\models\Scope::ATIVO,
                        ])
                        ->andWhere(['is', 'parent_id', new \yii\db\Expression('null')])
                        ->one();

                    if ($scope) {
                        $scope->name = $contexto->name;
                        if (!$scope->save()) {
                            $valid = false;
                            throw new HttpException(500, '11 - Erro ao atualizar os dados do inventário de dados do Cliente, motivo: ' . json_encode($scope->getErrors()));
                        }
                    }
                }

                if ($valid) {

                    ContextoTemModulo::deleteAll(['contexto_id' => $contexto->id]);

                    foreach ($contexto->modulos as $modulo) {
                        $contextoTemModulo = new ContextoTemModulo();
                        $contextoTemModulo->contexto_id = $contexto->id;
                        $contextoTemModulo->modulo = $modulo;

                        if (!$contextoTemModulo->save()) {
                            $valid = false;
                            foreach ($contextoTemModulo->getErrors() as $key => $value) {
                                foreach ($value as $chave => $erro) {
                                    $msgErro .= $erro . '<br />';
                                }
                            }
                            throw new HttpException(500, $msgErro);
                        }
                    }
                }

                $licenca->load(Yii::$app->request->post());

                if (!$licenca->save()) {
                    throw new HttpException(500, "6 - Erro licença: " . json_encode($licenca->getErrors()));
                }

                ContextoTemModeloRisco::deleteAll(['contexto_id' => $contexto->id]);
                $contextoTemModeloRisco = new ContextoTemModeloRisco();
                $contextoTemModeloRisco->load(Yii::$app->request->post());
                $contextoTemModeloRisco->contexto_id = $contexto->id;
                if (!$contextoTemModeloRisco->save()) {
                    throw new HttpException(500, '5a - Erro ao salvar o Modelo de Risco, motivo: ' . json_encode($contextoTemModeloRisco->getErrors()));
                }

                if ($valid) {
                    $transaction->commit();
                } else {
                    $transaction->rollBack();
                    throw new HttpException(500, $msgErro ?? '');
                }

                if ($valid) {
                    return $this->redirect(['/performance/default/gestor', 'tab' => $tab])->send();
                }
            } catch (Exception $exception) {
                $transaction->rollBack();
                throw new HttpException(500, $exception->getMessage());
            }
        }

        $clienteTemModulos = ClienteTemModulo::find()
            ->select('modulo')
            ->where(['cliente_id' => $contexto->cliente_id])
            ->column();

        $modulos = [];
        $modulosPossiveis = ClienteTemModulo::LISTA_MODULOS;
        foreach ($modulosPossiveis as $k => $modulosPossivel) {
            if (in_array($k, $clienteTemModulos)) {
                $modulos[$k] = $modulosPossivel;
            }
        }

        $listaModulosContexto = ContextoTemModulo::find()
            ->select('modulo')
            ->where(['contexto_id' => $contexto->id])
            ->column();
        //  $listaModulosCliente = $modulos;

        $listaConnectors = Projeto::CONNECTORS_LISTA;

        $contextoTemModeloRiscoUpdate = ContextoTemModeloRisco::find()
            ->where([
                'contexto_id' => $contexto->id,
            ])
            ->one();

        $contextoNaturezas = ArrayHelper::map(
            ContextoNatureza::find()
                ->where([
                    'status' => ContextoNatureza::ATIVO,
                ])
                ->all(),
            'id',
            'nome'
        );

        $municipios = ArrayHelper::map(Municipio::find()->innerJoinWith('estado', false)->where(['municipio.status' => Municipio::ATIVO])->orderBy('estado.nome ASC, nome ASC')->all(), 'id', 'nomeEstado', 'estado.nome');

        //     Utils::debug($municipios);

        //$this->layout = "//empty";
        return $this->render('update', [
            'contexto' => $contexto,
            'advogado' => $advogado,
            'usuarios' => $usuarios,
            'quantidadeUsuarios' => $quantidadeUsuarios,
            'modulos' => $modulos,
            'listaModulosContexto' => $listaModulosContexto,
            'verticais' => $verticais,
            'projetoTemVertical' => $projetoTemVertical,
            'projeto' => $projeto,
            'listaConnectors' => $listaConnectors,
            'riscosModelosLista' => $riscosModelosLista,
            'contextoTemModeloRisco' => $contextoTemModeloRisco,
            'licenca' => $licenca,
            'contextoTemModeloRiscoUpdate' => $contextoTemModeloRiscoUpdate,
            'contextoNaturezas' => $contextoNaturezas,
            'municipios' => $municipios,
        ]);
    }


    public function actionViewDetalheToken($token, $id, $aplicacao_id, $selectcoleta0 = null, $selectcoleta1 = null, $coletaplanoacao = null, $vertical_indicador_id = null, $detalhe = 'valor_global')
    {


        \app\models\Base::loga("Acessou a visualização de Contexto via Token", $_GET, $_POST, 49, $id);

        if ($token != "lGRUQrMvnCTzF8ovZrSRaz5bk3wuAlGRUQrMvnCTzF8ovZrSRaz5bk3wuA") {
            return "Erro 1";
        }

        $this->layout = '//detalhe';
        Url::remember();

        $contexto = Contexto::find()
            ->where([
                'id' => $id,
                'active' => Contexto::ATIVO,
            ])
            ->one();

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

        $aplicacao = Aplicacao::find()
            ->where([
                'id' => $aplicacao_id,
                'status' => Aplicacao::ATIVO,
            ])
            ->one();

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

        $projetos = AplicacaoTemProjeto::find()
            ->select('projeto_id')
            ->where(['aplicacao_id' => $aplicacao->id])
            ->column();

        $coletas = Coleta::find()
            ->where([
                'contexto_id' => $contexto->id,
                'status' => Coleta::ATIVO,
            ])
            ->andWhere(['in', 'projeto_id', $projetos])
            ->andWhere(['is not', 'data_coleta', new \yii\db\Expression('null')])
            ->orderBy('data_coleta ASC, id ASC')
            ->all();

        $coletasIds = [];
        $totalColetas = 0;
        $valorGlobal = 0;
        $coletaValores = [];
        $coletaNomes = [];
        $coletasIdNome = [];
        $percentual = 0;
        $evolucao = '';
        $totalIndicadores = 0;
        $totalIndicadoresDemandamAtencao = 0;
        $coletaApoioValorGlobal = 0;
        $coletaReferenciaIndicadores = null;
        $percentualIndicadorComprometedor = 0;
        $percentualIndicadorMercado = 0;
        $percentualIndicadorExcelencia = 0;
        $verticeColetaReferencia = null;

        $coletaReferencia = null; //dados exibidos
        $coletaApoio = null; //dados comparativos

        $listaValoresGlobais = [];
        foreach ($coletas as $coleta) {
            $cvG = $coleta->valorGlobal;
            $listaValoresGlobais[$coleta->id] = $cvG;
            $coletaValores[] = $cvG;
            $coletaNomes[] = $coleta->nome;
        }

        if ($selectcoleta0 && $selectcoleta1) {

            foreach ($coletas as $coleta) {

                if ($coleta->id == $selectcoleta1) {
                    $coletaReferencia = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta1])) {
                        $valorGlobal = $listaValoresGlobais[$selectcoleta1];
                    }
                }
            }
            foreach ($coletas as $coleta) {
                if ($coleta->id == $selectcoleta0) {
                    $coletaApoio = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta0])) {
                        $coletaApoioValorGlobal = $listaValoresGlobais[$selectcoleta0];
                    }
                }
            }
        } elseif ($selectcoleta0 && !$selectcoleta1) {

            foreach ($coletas as $coleta) {

                if ($coleta->id == $selectcoleta0) {
                    $coletaReferencia = $coleta;
                    if (isset($listaValoresGlobais[$selectcoleta0])) {
                        $valorGlobal = $listaValoresGlobais[$selectcoleta0];
                    }
                    break;
                }
            }
        } else {
            foreach ($coletas as $coleta) {
                $coletaReferencia = $coleta;
                if (isset($listaValoresGlobais[$coleta->id])) {
                    $valorGlobal = $listaValoresGlobais[$coleta->id];
                }
                $coletasIdNome[$coleta->id] = $coleta->nome;
                $coletasIds[] = $coleta->id;
            }
        }

        foreach ($coletas as $coleta) {
            $totalColetas++;
            $coletasIdNome[$coleta->id] = $coleta->nome;
            $coletasIds[] = $coleta->id;
            if (!$coletaReferencia) {
                $coletaReferencia = $coleta;
            }
        }

        /*
         * Verificando se os select pertencem
         */
        if ($selectcoleta0 && !in_array($selectcoleta0, $coletasIds)) {
            throw new HttpException(500, "Coleta selecionada não pertence ao Contexto");
        }
        if ($selectcoleta1 && !in_array($selectcoleta1, $coletasIds)) {
            throw new HttpException(500, "Coleta comparada não pertence ao Contexto");
        }

        $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        $percentual = 0;


        if ($selectcoleta0 && $selectcoleta1) {

            if (
                is_numeric($selectcoleta0) &&
                $selectcoleta0 != 0 &&
                is_numeric($selectcoleta1) &&
                isset($listaValoresGlobais[$selectcoleta0]) &&
                isset($listaValoresGlobais[$selectcoleta1])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta1] / (int) $listaValoresGlobais[$selectcoleta0]) - 1) * 100, 2);
            }
        } elseif ($selectcoleta1) {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($selectcoleta1) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                isset($listaValoresGlobais[$selectcoleta1])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta1] / (int) $listaValoresGlobais[$primeiraCol]) - 1) * 100, 2);
            }
        } elseif ($selectcoleta0) {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($selectcoleta0) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                $listaValoresGlobais[$primeiraCol] != 0 &&
                isset($listaValoresGlobais[$selectcoleta0])
            ) {
                $percentual = round((((int) $listaValoresGlobais[$selectcoleta0] / (int) $listaValoresGlobais[$primeiraCol]) - 1) * 100, 2);
            }
        } else {

            $listaTemp = array_keys($listaValoresGlobais);
            $primeiraCol = isset($listaTemp[0]) ? $listaTemp[0] : 0;
            $ultimaCol = end($listaTemp);

            if (
                is_numeric($primeiraCol) &&
                $primeiraCol != 0 &&
                is_numeric($ultimaCol) &&
                isset($listaValoresGlobais[$primeiraCol]) &&
                // $listaValoresGlobais[$primeiraCol] != 0 &&
                isset($listaValoresGlobais[$ultimaCol])
            ) {

                $pontuacao1 = $listaValoresGlobais[$primeiraCol];
                if ($pontuacao1 == 0) {
                    $pontuacao1 = 1;
                }
                $percentual = round((((int) $listaValoresGlobais[$ultimaCol] / (int) $pontuacao1) - 1) * 100, 2);
            }
        }


        //        if (isset($coletaValores[0])) {
        //            if (is_numeric($coletaValores[0]) && $coletaValores[0] != 0 && is_numeric(end($coletaValores)) && end($coletaValores) != 0) {
        //                $percentual = round((((int) end($coletaValores) / (int) $coletaValores[0]) - 1) * 100, 2);

        $icone = '<i class="fas fa-arrow-circle-up" style="color:#089F50"></i>';

        if ($percentual == 0) {

            $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        }
        if ($percentual < 0) {
            $icone = '<i class="fas fa-arrow-circle-down" style="color:#DF5353"></i>';
        }

        $evolucao = str_replace(".", ",", floatval($percentual)) . '% ' . $icone;
        //        }
        //    }
        //        if (isset($coletaValores[0])) {
        //            if (is_numeric($coletaValores[0]) && $coletaValores[0] != 0 && is_numeric(end($coletaValores)) && end($coletaValores) != 0) {
        //                $percentual = round((((int) end($coletaValores) / (int) $coletaValores[0]) - 1) * 100, 2);
        //
        //                $icone = '<i class="fas fa-arrow-circle-up" style="color:#089F50"></i>';
        //
        //                if ($percentual == 0) {
        //
        //                    $icone = '<i class="fas fa-minus-circle" style="color:#E8DD11"></i>';
        //                }
        //                if ($percentual < 0) {
        //                    $icone = '<i class="fas fa-arrow-circle-down" style="color:#DF5353"></i>';
        //                }
        //
        //                $evolucao = str_replace(".", ",", floatval($percentual)) . '% ' . $icone;
        //            }
        //        }

        $minimoComprometedor = 0;
        $minimoExcelencia = 80;

        $totalIndicadores = 0;
        $totalIndicadoresDemandamAtencao = 0;

        $listaNomeIndicadores = [];
        $listaValoresIndicadores = [];
        $indiceIndicador = 0;

        /*
         * 
         */
        $coletaReferenciaIndicacores = null;
        $coletaReferenciaIndicacoresExcelencia = 0;
        $coletaReferenciaIndicacoresMercado = 0;
        $coletaReferenciaIndicacoresComprometedor = 0;
        $coletaReferenciaListaIndicacoresExcelencia = [];
        $coletaReferenciaListaIndicacoresMercado = [];
        $coletaReferenciaListaIndicacoresComprometedor = [];

        //$gppCausaProvaveis = ArrayHelper::map(GppCausaProvavel::find()->all(), 'id', 'vertical_indicador_id');
        $gppCausaProvaveis = [];
        //        $paPlanoAcaos = ArrayHelper::map(
        //                        PlanoAcao::find()
        //                                ->where([
        //                                    'contexto_id' => $contexto->id ?? null,
        //                                    'status' => PlanoAcao::ATIVO,
        //                                ])
        //                                ->all(), 'id', 'vertical_indicador_id');

        $paPlanosAcaoTemVertical = \app\modules\performance\models\PlanoAcaoTemIndicador::find()
            ->joinWith('paPlanoAcao')
            ->select('pa_plano_acao_tem_indicador.vertical_indicador_id')
            ->where([
                'contexto_id' => $contexto->id ?? null,
                'status' => PlanoAcao::ATIVO,
            ])
            ->column();
        //Utils::debug($paPlanosAcaoTemVertical);

        if ($coletaReferencia) {

            $indicadorSparkline = [];

            $coletaIndicadoresSparkline = ColetaIndicador::find()
                ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id=coleta_indicador.estrutura_id')
                ->join('LEFT JOIN', 'coleta', 'coleta.id=coleta_estrutura.coleta_id')
                ->where([
                    'coleta.projeto_id' => $coletaReferencia->projeto_id,
                    'coleta.vertical_id' => $coletaReferencia->vertical_id,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta.contexto_id' => $contexto->id ?? null,
                    'coleta.status' => Coleta::ATIVO,
                ])
                ->orderBy('coleta.data_coleta ASC, coleta.id ASC')
                ->all();

            foreach ($coletaIndicadoresSparkline as $coletaIndicadorSparkline) {
                if ($coletaIndicadorSparkline->vertical_indicador_id) {
                    $indicadorSparkline[$coletaIndicadorSparkline->vertical_indicador_id][] = $coletaIndicadorSparkline->pontuacao;
                }
            }

            $coletaReferenciaIndicadores = ColetaIndicador::find()
                ->select([
                    'coleta_indicador.id as id',
                    'coleta_indicador.nome as nome',
                    'coleta_indicador.pontuacao as pontuacao',
                    'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                    'coleta_indicador.conceito as conceito',
                    'coleta_indicador.estrutura_id as estrutura_id',
                    'vertical_indicador.usa_interpolacao as usainterpolacao',
                ])
                ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                ->where([
                    'coleta_estrutura.coleta_id' => $coletaReferencia->id,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO
                ])
                ->asArray()
                ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                ->all();
            foreach ($coletaReferenciaIndicadores as $coletaReferenciaIndicador) {

                $listaNomeIndicadores[] = $coletaReferenciaIndicador['nome'];

                $listaValoresIndicadores[] = ['y' => (int) $coletaReferenciaIndicador['pontuacao']];

                $minimoTemp = 0;
                $maximoTemp = 0;
                foreach ($coletaReferenciaIndicador['coletaAlternativas'] as $coletaAlternativaExcelencia) {
                    if ($coletaAlternativaExcelencia['nivel_referencia'] < $minimoTemp) {
                        $minimoTemp = $coletaAlternativaExcelencia['nivel_referencia'];
                    }
                    if ($coletaAlternativaExcelencia['nivel_referencia'] > $maximoTemp) {
                        $maximoTemp = $coletaAlternativaExcelencia['nivel_referencia'];
                    }
                }
                $coletaReferenciaIndicador['minimo'] = $minimoTemp;
                $coletaReferenciaIndicador['maximo'] = $maximoTemp;
                $coletaReferenciaIndicador['ordem'] = $indiceIndicador;
                $coletaReferenciaIndicador['vertical_indicador_id'] = $coletaReferenciaIndicador['vertical_indicador_id'];
                $coletaReferenciaIndicador['usainterpolacao'] = $coletaReferenciaIndicador['usainterpolacao'];

                $coletaReferenciaIndicador['sparkline'] = '';
                if (isset($indicadorSparkline[$coletaReferenciaIndicador['vertical_indicador_id']])) {
                    $coletaReferenciaIndicador['sparkline'] = implode(",", $indicadorSparkline[$coletaReferenciaIndicador['vertical_indicador_id']]);
                }

                //                if (in_array($coletaReferenciaIndicador['vertical_indicador_id'], $gppCausaProvaveis)) {
                //                    $coletaReferenciaIndicador['planoaplicacao'] = '<i class="fab fa-product-hunt" title="Possui Plano de Ação"></i>';
                //                } else
                if (in_array($coletaReferenciaIndicador['vertical_indicador_id'], $paPlanosAcaoTemVertical)) {
                    $coletaReferenciaIndicador['planoaplicacao'] = '<i class="fab fa-product-hunt" title="Possui Plano de Ação"></i>';
                } else {
                    $coletaReferenciaIndicador['planoaplicacao'] = '';
                }

                if ($coletaReferenciaIndicador['pontuacao'] >= $minimoExcelencia) {

                    $coletaReferenciaListaIndicacoresExcelencia[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresExcelencia++;
                } elseif ($coletaReferenciaIndicador['pontuacao'] <= $minimoComprometedor) {

                    $coletaReferenciaListaIndicacoresComprometedor[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresComprometedor++;
                    $totalIndicadoresDemandamAtencao++;
                } else {

                    $coletaReferenciaListaIndicacoresMercado[] = $coletaReferenciaIndicador;
                    $coletaReferenciaIndicacoresMercado++;
                }

                $indiceIndicador++;
            }

            $totalIndicadores = count($coletaReferenciaIndicadores);


            $percentualIndicadorComprometedor = 0;
            $percentualIndicadorMercado = 0;
            $percentualIndicadorExcelencia = 0;
            if ($totalIndicadores > 0) {
                $percentualIndicadorComprometedor = ($coletaReferenciaIndicacoresComprometedor / $totalIndicadores) * 100;
                $percentualIndicadorComprometedor = round($percentualIndicadorComprometedor, 2);

                $percentualIndicadorMercado = ($coletaReferenciaIndicacoresMercado / $totalIndicadores) * 100;
                $percentualIndicadorMercado = round($percentualIndicadorMercado, 2);

                $percentualIndicadorExcelencia = 100 - ($percentualIndicadorMercado + $percentualIndicadorComprometedor);
                $percentualIndicadorExcelencia = round($percentualIndicadorExcelencia, 2);

                $percentualIndicadorComprometedor = str_replace(".", ",", $percentualIndicadorComprometedor);
                $percentualIndicadorMercado = str_replace(".", ",", $percentualIndicadorMercado);
                $percentualIndicadorExcelencia = str_replace(".", ",", $percentualIndicadorExcelencia);
            }
        }

        $verticalPeriodicidade = Vertical::PERIODO_UNICO;
        if ($coletaReferencia && $coletaReferencia->vertical) {

            $verticalColetaReferencia = $coletaReferencia->vertical;

            if ($verticalColetaReferencia->periodicidade == Vertical::PERIODO_DIARIO) {
                $verticalPeriodicidade = $verticalColetaReferencia->periodicidade;
            }
        }

        $parametrosCliente = ClienteTemParametro::find()
            ->where(['cliente_id' => $contexto->cliente_id, 'status' => ClienteTemParametro::ATIVO,])
            ->all();

        $parametrosContexto = ContextoTemParametro::find()
            ->where(['contexto_id' => $contexto->id, 'status' => ContextoTemParametro::ATIVO,])
            ->all();

        $parametrosLabel = [];
        foreach ($parametrosCliente as $parametroCliente) {
            if ($parametroCliente->tipo == ClienteTemParametro::LABEL) {
                $parametrosLabel[$parametroCliente->parametro] = $parametroCliente->valor;
            }
        }
        foreach ($parametrosContexto as $parametroContexto) {
            if ($parametroContexto->tipo == ContextoTemParametro::LABEL) {
                $parametrosLabel[$parametroContexto->parametro] = $parametroContexto->informacao;
            }
        }

        $verticeUltimaColeta = null;
        $coletaEstruturaPvfs = null;

        $minProjeto = 0;
        $maxProjeto = 100;

        $faixasPadrao = [];
        $plots = [];

        if ($coletaReferencia) {

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

            $coletaEstruturaPvfs = ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coletaReferencia->id,
                    'cod_pai' => $verticeColetaReferencia ? $verticeColetaReferencia->id : null,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->orderBy('ordem ASC')
                ->all();

            $faixasPadrao = $coletaReferencia->faixasPadrao;

            foreach ($faixasPadrao as $key => $v) {

                //list($r, $g, $b) = sscanf($v['color'], "#%02x%02x%02x");
                //$plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];

                $plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => str_replace(",0.9", ",0.4", $v['color']), 'zIndex' => 0];

                if ($v["from"] < $minProjeto) {
                    $minProjeto = $v["from"];
                }
                if ($v["to"] > $maxProjeto) {
                    $maxProjeto = $v["to"];
                }
            }
        }

        $coletaApoioIndicacoresComprometedor = 0;
        $coletaApoioIndicacoresMercado = 0;
        $coletaApoioIndicacoresExcelencia = 0;
        $coletaApoiolistaValoresIndicadores = [];
        $coletaApoioEstruturaPvf = [];

        if ($coletaApoio) {

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

            $coletaApoioEstruturaPvf = ArrayHelper::map(ColetaEstrutura::find()
                ->where([
                    'coleta_id' => $coletaApoio->id,
                    'cod_pai' => $verticeColetaApoio ? $verticeColetaApoio->id : null,
                    'status' => ColetaEstrutura::ATIVO,
                ])
                ->orderBy('ordem ASC')
                ->all(), 'nome', 'pontuacao');

            $coletaApoioIndicadores = ColetaIndicador::find()
                ->select([
                    'coleta_indicador.id as id',
                    'coleta_indicador.nome as nome',
                    'coleta_indicador.pontuacao as pontuacao',
                    'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                    'coleta_indicador.conceito as conceito',
                    'coleta_indicador.estrutura_id as estrutura_id',
                    'vertical_indicador.usa_interpolacao as usainterpolacao',
                ])
                ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                ->where([
                    'coleta_estrutura.coleta_id' => $coletaApoio->id,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_indicador.status' => ColetaIndicador::ATIVO
                ])
                ->asArray()
                ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                ->all();

            foreach ($coletaApoioIndicadores as $coletaApoioIndicador) {
                if ($coletaApoioIndicador['pontuacao'] >= $minimoExcelencia) {
                    $coletaApoioIndicacoresExcelencia++;
                } elseif ($coletaApoioIndicador['pontuacao'] <= $minimoComprometedor) {
                    $coletaApoioIndicacoresComprometedor++;
                } else {
                    $coletaApoioIndicacoresMercado++;
                }

                $coletaApoiolistaValoresIndicadores[] = ['y' => (int) $coletaApoioIndicador['pontuacao']];
            }
        }

        $responsaveis = [];
        $dadosVerticalIndicadorResponsavel = [];
        $indicadorResponsavelOrdem = [];

        if ($coletaReferencia) {

            //            $dadosResponsaveis = VerticalIndicadorTemParametro::find()
            //                    ->join('LEFT JOIN', 'coleta_indicador', 'vertical_indicador_tem_parametro.vertical_indicador_id=coleta_indicador.vertical_indicador_id')
            //                    ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_indicador.estrutura_id=coleta_estrutura.id')
            //                    ->where([
            //                        'vertical_indicador_tem_parametro.parametro' => 'Responsável',
            //                        'coleta_estrutura.coleta_id' => $coletaReferencia->id,
            //                        'vertical_indicador_tem_parametro.status' => VerticalIndicadorTemParametro::ATIVO,
            //                        'coleta_indicador.status' => ColetaIndicador::ATIVO,
            //                        'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
            //                    ])
            //                    ->orderBy('vertical_indicador_tem_parametro.valor')
            //                    ->all();
            //
            //
            //            foreach ($dadosResponsaveis as $dadoResponsavel) {
            //                $responsaveis[str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor))] = $dadoResponsavel->valor;
            //
            //                $dadosVerticalIndicadorResponsavel[$dadoResponsavel->vertical_indicador_id] = str_replace(" ", "_", str_replace("/", "", $dadoResponsavel->valor));
            //            }
            //            foreach ($coletaReferenciaIndicadores as $indicadorColetaAll) {
            //
            //                if (isset($dadosVerticalIndicadorResponsavel[$indicadorColetaAll['vertical_indicador_id']])) {
            //                    $indicadorResponsavelOrdem[] = $dadosVerticalIndicadorResponsavel[$indicadorColetaAll['vertical_indicador_id']];
            //                } else {
            //                    $indicadorResponsavelOrdem[] = '';
            //                }
            //            }
        }

        $dadosContexto = [];

        //        $fotos = Foto::find()
        //                ->joinWith('coleta')
        //                ->where([
        //                    'foto.status' => Foto::ATIVO,
        //                    'coleta.status' => Coleta::ATIVO,
        //                ])
        //                ->andwhere(['in', 'coleta.id', $coletasIds])
        //                ->all();
        //        $timelines = Timeline::find()
        //                ->where([
        //                    'tipo' => Timeline::TIPO_CONTEXTO,
        //                    'vinculo' => $contexto->id,
        //                    'status' => Timeline::ATIVO,
        //                ])
        //                ->orderBy('data_cadastro DESC')
        //                ->all();

        $pareceresTecnicos = ParecerTecnicoColeta::find()
            ->joinWith('coleta')
            ->joinWith(['createdBy', 'updatedBy update'])
            ->where([
                'coleta.contexto_id' => $contexto->id,
                'parecer_tecnico_coleta.status' => ParecerTecnicoColeta::ATIVO
            ])
            ->andWhere(['>', 'parecer_tecnico_coleta.created_at', '2019-08-15 08:00:00'])
            ->orderBy('id ASC')
            ->asArray()
            ->all();

        //        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
        //                ->joinWith(['createdBy'])
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
        //                ])
        //                ->orderBy('prioridade ASC, id DESC')
        //                ->all();
        //
        //        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

        $anexos = Anexo::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $contexto->id,
                'anexo.status' => Anexo::ATIVO
            ])
            ->orderBy('id ASC')
            ->asArray()
            ->all();

        $totalDisco = 0;
        foreach ($anexos as $anexo) {
            $totalDisco += $anexo['tamanho'];
        }
        $totalGB = round(($totalDisco / 1000000000), 3);
        $percentualDisco = round($totalGB / $contexto->cota_disco, 3);

        if ($percentualDisco >= 80) {
            $bgDisco = 'red';
        } elseif ($percentualDisco >= 60) {
            $bgDisco = 'orange';
        } elseif ($percentualDisco >= 40) {
            $bgDisco = 'yellow';
        } elseif ($percentualDisco >= 20) {
            $bgDisco = 'blue';
        } else {
            $bgDisco = 'green';
        }

        if ($percentualDisco > 60) {
            Yii::$app->mailer->compose('_cota_contexto', [
                'contexto' => $contexto,
                'percentualDisco' => $percentualDisco,
            ])
                ->setFrom(['no-reply@krinom.com.br' => 'Accia'])
                ->setTo('gledson@krinom.com.br')
                ->setSubject('Contexto com uso de cota de disco elevada na Accia')
                ->send();
        }

        $totalGB = str_replace(".", ",", $totalGB);

        $contatos = '';
        foreach ($contexto->contextoTemContatos as $contextoContato) {
            if ($contextoContato->status == ContextoTemContato::ATIVO) {
                $contatos .= $contextoContato->contato . "<br />";
            }
        }


        $docsExiste = [];

        foreach ($contexto->cliente->clienteTemDocs as $clienteTemDoc) {
            if ($clienteTemDoc->status == ClienteTemDocs::ATIVO) {
                $docsExiste[] = $clienteTemDoc->doc;
            }
        }

        //        $pesePlanoAplicacaoFullModel = PesePlanoAplicacao::find()
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'tipo' => PesePlanoAplicacao::FULL,
        //                    'status' => PesePlanoAplicacao::ATIVO,
        //                ])
        //                ->one();
        //
        //        $pesePlanoAplicacaoFull = PesePlanoAplicacao::full($pesePlanoAplicacaoFullModel);
        //
        //        $pesePlanoAplicacaoBasicModel = PesePlanoAplicacao::find()
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'tipo' => PesePlanoAplicacao::BASIC,
        //                    'status' => PesePlanoAplicacao::ATIVO,
        //                ])
        //                ->one();
        //
        //        $pesePlanoAplicacaoBasic = PesePlanoAplicacao::basic($pesePlanoAplicacaoBasicModel);
        //
        //        $pesePlanoAplicacaoDashboard = PesePlanoAplicacao::dashboard($pesePlanoAplicacaoFullModel, $pesePlanoAplicacaoBasicModel);
        //
        //        $planoAplicacaoSegmentos = \yii\helpers\ArrayHelper::map(
        //                        PeseSegmento::find()
        //                                ->where(['status' => PeseSegmento::ATIVO])
        //                                ->orderBy('descricao ASC')->all(),
        //                        'id', 'descricao');
        //
        //        $servicosContratados = ContextoTemServico::find()
        //                ->select('servico')
        //                ->where([
        //                    'contexto_id' => $contexto->id,
        //                    'status' => ContextoTemServico::ATIVO,
        //                ])
        //                ->column();

        $isCeon = Logged::isCeon();

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

        $coresPadrao = [];
        $coresPadrao[0] = \app\modules\risk\models\RiscoCenario::COR_BAIXO;
        $coresPadrao[1] = \app\modules\risk\models\RiscoCenario::COR_MODERADO;
        $coresPadrao[2] = \app\modules\risk\models\RiscoCenario::COR_ALTO;
        $coresPadrao[3] = \app\modules\risk\models\RiscoCenario::COR_CRITICO;


        $coresPadrao = [];
        $coresPadrao[0] = 'rgba(8,159,80, 0.15)';
        $coresPadrao[1] = 'rgba(232,221,17, 0.15)';
        $coresPadrao[2] = 'rgba(223,83,83, 0.15)';
        $coresPadrao[3] = 'rgba(223,83,83, 0.15)';


        $riscoCenario = \app\modules\risk\models\RiscoCenario::find()
            ->where(['status' => RiscoCenario::ATIVO])
            ->andWhere(['in', 'coleta_vinculo', $coletasIds])
            ->orderBy('id DESC')
            ->one();

        $riscosCategorias = [];
        $cores = [];
        $coresPadrao = [];
        $cenarios = [];

        if ($riscoCenario) {
            $riscosCategorias = \app\modules\risk\models\RiscoModelo::riscoCategoria($riscoCenario->riscoModelo);

            $cores = $riscoCenario->cores['cores'];
            $coresPadrao = $riscoCenario->cores['coresPadrao'];

            $cenarios = \app\modules\risk\models\RiscoCenario::find()
                ->join('LEFT JOIN', 'coleta', 'risco_cenario.coleta_vinculo=coleta.id')
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'risco_cenario.status' => \app\modules\risk\models\Risco::ATIVO,
                ])
                ->andWhere(['=', 'coleta.contexto_id', $contexto->id])
                ->all();
        }

        $todosCenarios = [];
        $todosCenariosPontuacao = [];
        $todosCenariosDrilldrown = [];
        $todosRiscos = [];
        $maxPontuacaoRisco = 0;

        foreach ($cenarios as $cenario) {


            if ($cenario->pontuacao <= 25) {
                $cor = $coresPadrao[0];
            } elseif ($cenario->pontuacao <= 50) {
                $cor = $coresPadrao[1];
            } elseif ($cenario->pontuacao <= 75) {
                $cor = $coresPadrao[2];
            } else {
                $cor = $coresPadrao[3];
            }

            $todosCenariosPontuacao[] = [
                'name' => $cenario->nome,
                'id' => $cenario->id,
                'y' => $cenario->pontuacao,
                'color' => $cor,
                'drilldown' => 'd' . $cenario->id,
                'tipo' => 'cenario',
                'dataLabels' => true,
            ];

            $r = 1;
            $riscos = $cenario->getRiscos()->where('status=1')->all();

            $todosCenarios[$cenario->id]['nome'] = $cenario->nome;
            $todosCenarios[$cenario->id]['coleta'] = $cenario->coleta_vinculo . ' - ' . $cenario->coletaVinculo->nome;
            $todosCenarios[$cenario->id]['coleta-nome'] = $cenario->coletaVinculo->nome;
            $todosCenarios[$cenario->id]['riscos'] = $riscos;
            $todosCenarios[$cenario->id]['matrizConsequenciaProbabilidade'] = $cenario->matrizConsequenciaProbabilidade;
            $dataRisco = [];
            $riscosConsequenciaProbabilidade = [];

            foreach ($riscos as $risco) {

                $riscosConsequenciaProbabilidade[] = [
                    'nome' => 'R' . $r . ' - ' . $risco->nome,
                    'consequencia' => $risco->consequencia_valor,
                    'probabilidade' => $risco->probabilidade,
                ];

                $pontuacaoRisco = round($risco->consequencia_valor * ($risco->probabilidade / 100));

                //$todosRiscos[$r]['name'] = 'R' . $r;
                $todosRiscos[$r]['name'] = 'R' . $r . ' - ' . $risco->nome;
                $todosRiscos[$r]['type'] = 'line';
                $todosRiscos[$r]['data'][] = $pontuacaoRisco;
                $todosRiscos[$r]['tooltip']['valueSuffix'] = ' pts';
                $todosRiscos[$r]['dataLabels'] = false;

                if ($pontuacaoRisco > $maxPontuacaoRisco) {
                    $maxPontuacaoRisco = $pontuacaoRisco;
                }

                if ($risco->consequencia_descricao == 'Leve') {

                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[0];
                    } else {
                        $corRisco = $coresPadrao[0];
                    }
                } elseif ($risco->consequencia_descricao == 'Moderado') {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[1];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[1];
                    } else {
                        $corRisco = $coresPadrao[0];
                    }
                } elseif ($risco->consequencia_descricao == 'Grave') {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[1];
                    } else {
                        $corRisco = $coresPadrao[1];
                    }
                } else {
                    if ($risco->probabilidade > 75) {
                        $corRisco = $coresPadrao[3];
                    } elseif ($risco->probabilidade > 50) {
                        $corRisco = $coresPadrao[2];
                    } elseif ($risco->probabilidade > 25) {
                        $corRisco = $coresPadrao[2];
                    } else {
                        $corRisco = $coresPadrao[1];
                    }
                }


                $dataRisco[] = [
                    'name' => 'R' . $r,
                    'nameCompleto' => 'R' . $r . ' - ' . $risco->nome,
                    'id' => 'risco' . $risco->id,
                    'y' => $pontuacaoRisco,
                    'color' => $corRisco,
                    'tipo' => 'risco',
                    'consequencia' => $risco->consequencia_descricao,
                    'probabilidade' => $risco->probabilidade . '%',
                    'tooltip' => [
                        'formatter' => " function () { return 'Custom Format...'; }",
                    ],
                    'dataLabels' => true,
                ];

                $r++;
            }

            $todosCenariosDrilldrown[] = [
                'id' => 'd' . $cenario->id,
                'name' => $cenario->nome,
                'data' => $dataRisco,
                'pointWidth' => 50,
                //'pointWidth' => count($dataRisco) <= 1 ? 50 : 'null',
            ];

            $todosCenarios[$cenario->id]['riscosConsequenciaProbabilidade'] = $riscosConsequenciaProbabilidade;
        }


        $avisaPendencia = false;
        $botoes = false;
        $permiteEditar = false;

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

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


        $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);

        $analisesRegulatoriasContexto = \app\models\ContextoTemAnaliseRegulatoria::find()
            ->where(['contexto_id' => $contexto->id])
            ->all();

        $planoAcaos = PlanoAcao::find()
            ->where([
                'contexto_id' => $contexto->id,
                'status' => PlanoAcao::ATIVO,
            ])
            ->all();

        $licenciado = 0;
        if ($contexto->tipoLicenca == 'Licenciado') {
            $licenciado = 1;
        }

        $fluxoInventario = \app\models\InventarioResposta::percentualInventarioRespondido($contexto);
        $fluxoColeta = \app\modules\performance\models\Coleta::percentualColetaRespondido($contexto, $coletaReferencia);
        $fluxoRisco = \app\modules\risk\models\RiscoCenario::percentualRiscoRespondido($todosCenarios);
        $fluxoPlanoAcao = \app\modules\performance\models\PlanoAcao::percentualPlanoAcaoCriados($contexto, $coletaReferencia, $coletaReferenciaListaIndicacoresComprometedor);
        $fluxoDocsAdequacao = \app\modules\performance\models\ColetaIndicador::percentualDocsAdequacaoCriados($contexto, $coletaReferencia);

        //Utils::debug($fluxoRisco);


        $niveisValorGlobal = [];
        $niveisValorGlobal[] = ["from" => 0, "to" => 20, "color" => "#DF5353", "label" => "Comprometedor"];
        $niveisValorGlobal[] = ["from" => 20.01, "to" => 80, "color" => "#e8dd11", "label" => "Mercado"];
        $niveisValorGlobal[] = ["from" => 80.01, "to" => 100, "color" => "#089f50", "Excelência"];
        $plots = [];
        foreach ($niveisValorGlobal as $key => $v) {

            list($r, $g, $b) = sscanf($v['color'], "#%02x%02x%02x");
            $plots[] = ['from' => $v['from'], 'to' => $v['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];
        }

        $recomendacoesSeguranca = RecomendacaoSeguranca::find()
            ->joinWith(['createdBy'])
            ->where([
                'contexto_id' => $contexto->id,
                'recomendacao_seguranca.status' => RecomendacaoSeguranca::ATIVO
            ])
            ->orderBy('prioridade ASC, id DESC')
            ->all();

        $prioridades = [1 => 'Importante', 2 => 'Recomendável', 3 => 'Desejável'];

        $coletasPerfilDesempenhoComparativo = [];

        $coletaIndicadoresComparativo = [];

        if (isset($_POST['comparativo'])) {

            $listaColetasComparativoPostado = $_POST['comparativo'];

            foreach ($coletas as $coleta) {
                if (in_array($coleta->id, $_POST['comparativo'])) {
                    $coletaComparativoIndicadores = ColetaIndicador::find()
                        ->select([
                            'coleta_indicador.id as id',
                            'coleta_indicador.nome as nome',
                            'coleta_indicador.pontuacao as pontuacao',
                            'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                            'coleta_indicador.conceito as conceito',
                            'coleta_indicador.estrutura_id as estrutura_id',
                            'vertical_indicador.usa_interpolacao as usainterpolacao',
                        ])
                        ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
                        ->where([
                            'coleta_estrutura.coleta_id' => $coleta->id,
                            'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                            'coleta_indicador.status' => ColetaIndicador::ATIVO
                        ])
                        ->asArray()
                        ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
                        ->all();


                    $coletaComparativolistaValoresIndicadores = [];
                    $z = 0;
                    foreach ($coletaComparativoIndicadores as $k => $coletaComparativoIndicador) {
                        $coletaComparativolistaValoresIndicadores[] = ['y' => (int) $coletaComparativoIndicador['pontuacao']];

                        $coletaComparativoIndicador['ordem'] = $indiceIndicadorComparativo;


                        if (isset($pareceresTecnicosVerticalIndicador[$coletaComparativoIndicador['vertical_indicador_id']])) {

                            $coletaComparativoIndicadores[$z]['parecer_indicador'] = 'sim';
                        }

                        $indiceIndicadorComparativo++;
                        $z++;
                    }



                    $coletasPerfilDesempenhoComparativo[] = [
                        'name' => $coleta->nome ?? 'N/D',
                        'data' => $coletaComparativolistaValoresIndicadores,
                        'coletaid' => $coleta->id,
                    ];

                    $coletaIndicadoresComparativo[$coleta->id] = $coletaComparativoIndicadores;
                }

                //Utils::debug($coletaComparativolistaValoresIndicadores);
            }
        } else {
            $coletasPerfilDesempenhoComparativo[] = [
                'name' => $coletaReferencia->nome ?? 'N/D',
                'data' => $listaValoresIndicadores,
                'coletaid' => $coletaReferencia->id ?? null,
            ];

            $coletaIndicadoresComparativo[$coletaReferencia->id ?? 0] = $coletaReferenciaIndicadores;
        }

        return $this->render($detalhe, [
            'aplicacao' => $aplicacao,
            'model' => $contexto,
            'parametrosLabel' => $parametrosLabel,
            'coletaReferencia' => $coletaReferencia,
            'totalColetas' => $totalColetas,
            'valorGlobal' => $valorGlobal,
            'coletaValores' => $coletaValores,
            'coletaNomes' => $coletaNomes,
            'coletasIdNome' => $coletasIdNome,
            'percentual' => $percentual,
            'evolucao' => $evolucao,
            'totalIndicadores' => $totalIndicadores,
            'totalIndicadoresDemandamAtencao' => $totalIndicadoresDemandamAtencao,
            'verticalPeriodicidade' => $verticalPeriodicidade,
            'coletaEstruturaPvfs' => $coletaEstruturaPvfs,
            'parametrosContexto' => $parametrosContexto,
            'coletaReferenciaIndicadores' => $coletaReferenciaIndicadores,
            'coletaReferenciaIndicacoresComprometedor' => $coletaReferenciaIndicacoresComprometedor,
            'percentualIndicadorComprometedor' => $percentualIndicadorComprometedor,
            'coletaReferenciaListaIndicacoresComprometedor' => $coletaReferenciaListaIndicacoresComprometedor,
            'coletaReferenciaIndicacoresMercado' => $coletaReferenciaIndicacoresMercado,
            'percentualIndicadorMercado' => $percentualIndicadorMercado,
            'coletaReferenciaListaIndicacoresMercado' => $coletaReferenciaListaIndicacoresMercado,
            'coletaReferenciaIndicacoresExcelencia' => $coletaReferenciaIndicacoresExcelencia,
            'percentualIndicadorExcelencia' => $percentualIndicadorExcelencia,
            'coletaReferenciaListaIndicacoresExcelencia' => $coletaReferenciaListaIndicacoresExcelencia,
            'verticeColetaReferencia' => $verticeColetaReferencia,
            'minProjeto' => $minProjeto,
            'maxProjeto' => $maxProjeto,
            'responsaveis' => [],
            'faixasPadrao' => $faixasPadrao,
            'plots' => $plots,
            'listaNomeIndicadores' => $listaNomeIndicadores,
            'listaValoresIndicadores' => $listaValoresIndicadores,
            'indicadorResponsavelOrdem' => [],
            'pareceresTecnicos' => $pareceresTecnicos,
            'anexos' => $anexos,
            'contatos' => $contatos,
            'docsExiste' => $docsExiste,
            'isCeon' => $isCeon,
            'coletaApoio' => $coletaApoio,
            'coletaApoioEstruturaPvf' => $coletaApoioEstruturaPvf,
            'coletaApoioValorGlobal' => $coletaApoioValorGlobal,
            'coletaApoioIndicacoresComprometedor' => $coletaApoioIndicacoresComprometedor,
            'coletaApoioIndicacoresMercado' => $coletaApoioIndicacoresMercado,
            'coletaApoioIndicacoresExcelencia' => $coletaApoioIndicacoresExcelencia,
            'coletaApoiolistaValoresIndicadores' => $coletaApoiolistaValoresIndicadores,
            'riscoCenario' => $riscoCenario,
            'dadosVerticalIndicadorResponsavel' => $dadosVerticalIndicadorResponsavel,
            'coletaplanoacao' => $coletaplanoacao,
            'vertical_indicador_id' => $vertical_indicador_id,
            'todosCenariosPontuacao' => $todosCenariosPontuacao,
            'todosCenarios' => $todosCenarios,
            'todosRiscos' => $todosRiscos,
            'todosCenariosDrilldrown' => $todosCenariosDrilldrown,
            'riscosCategorias' => $riscosCategorias,
            'cores' => $cores,
            'coresPadrao' => $coresPadrao,
            'avisaPendencia' => $avisaPendencia,
            'botoes' => $botoes,
            'origem' => 'contexto',
            'permiteEditar' => $permiteEditar,
            'ultimasAtualizacoes' => $ultimasAtualizacoes,
            'organograma' => $organograma,
            'totalNotificacoes' => $totalNotificacoes,
            'analisesRegulatoriasContexto' => $analisesRegulatoriasContexto,
            'planoAcaos' => $planoAcaos,
            'licenciado' => $licenciado,
            'totalGB' => $totalGB,
            'percentualDisco' => $percentualDisco,
            'bgDisco' => $bgDisco,
            'fluxoInventario' => $fluxoInventario,
            'fluxoColeta' => $fluxoColeta,
            'fluxoPlanoAcao' => $fluxoPlanoAcao,
            'fluxoDocsAdequacao' => $fluxoDocsAdequacao,
            'fluxoRisco' => $fluxoRisco,
            'recomendacoesSeguranca' => $recomendacoesSeguranca,
            'prioridades' => $prioridades,
            'processoScopes' => [],
            'legislacaoCorrespondentes' => [],
            'anexoArvore' => json_encode([]),
            'token' => $token,
            'coletasPerfilDesempenhoComparativo' => $coletasPerfilDesempenhoComparativo,
        ]);
    }

    public function actionListaInstalacoes()
    {

        $this->responseAsJson();
        $out = [];
        $data = Yii::$app->request->post('depdrop_parents');
        $list = [];
        if ($data) {

            ////////////
            $id1 = $data[1];
            if ($id1) {

                $municipios = Municipio::find()
                    ->select('id')
                    ->where([
                        'estado_id' => $id1,
                        'status' => 1,
                    ])
                    ->column();

                $contextos = Contexto::find()
                    ->select('name')
                    ->where([
                        'active' => 1,
                    ])
                    ->andWhere(['in', 'municipio_id', $municipios])
                    ->orderBy('name ASC')
                    ->column();

                $locais = Local::find()
                    ->where([
                        'active' => 1,
                    ])
                    ->andWhere(['in', 'name', $contextos])
                    ->orderBy('name ASC')
                    ->all();

                if (!$locais) {
                    return ['output' => $out, 'selected' => ''];
                }

                foreach ($locais as $local) {
                    $out[] = ['id' => $local->id, 'name' => $local->name];
                }

                return ['output' => $out, 'selected' => ''];
            }
        }

        //////////////

        $id = $data[0];
        if ($id) {

            $ativo = Ativo::find()->joinWith(['origem o'])
                ->alias('t')
                ->join('INNER JOIN', 'contexto', 't.contexto=contexto.id')

                ->where(['o.id' => $id])
                ->andWhere(['t.active' => 1, 'o.isDeleted' => Status::IS_NOT_DELETED])
                ->one();

            if ($ativo) {

                $local = $ativo->contextoTemLocal->local;

                if ($local->rgt - $local->lft == 1) {
                    $r = [];
                    $parents = $local->parents()->all();

                    foreach ($local->parents()->all() as $k) {
                        if ($k->active == 1) {
                            $r[] = $k->name;
                        }
                    }
                    $r = implode(" >> ", $r);
                    $out[] = ['id' => $local->id, 'name' => $local->name];


                    $selected = $local->id;
                }

                $filhos = $local->children()->orderBy('name ASC')->all();



                if (count($filhos) > 0) {

                    $selected = $ativo->contextoTemLocal->co_local_id;

                    foreach ($filhos as $i => $item) {

                        if ($item->active == 1) {
                            if ($item->rgt - $item->lft == 1) {

                                $a = Local::findOne($item->id);
                                $r = [];
                                foreach ($a->parents()->all() as $k) {
                                    $r[] = $k->name;
                                }
                                $r = implode(" >> ", $r);
                                $out[] = ['id' => $item->id, 'name' => $item->name];

                                foreach ($out as $key => $row) {
                                    $id[$key] = $row['id'];
                                    $name[$key] = $row['name'];
                                }

                                //  array_multisort($id, SORT_ASC, $name, SORT_ASC, $out);
                            }
                        }
                    }

                    if (count($filhos) == 1) {
                        $selected = $filhos[0]['id'];
                    } else {
                        $selected = '';
                    }
                }

                return ['output' => $out, 'selected' => ''];
            }
        }

        return ['output' => '', 'selected' => ''];
    }

    public function actionListaSubtipos()
    {

        $this->responseAsJson();
        $out = [];
        $data = Yii::$app->request->post('depdrop_parents');
        $list = [];
        if ($data) {
            $id = end($data);
            if ($id) {

                $subtipos = OcorrenciaSubtipo::find()
                    ->where([
                        'co_ocorrencia_tipo_id' => $id,
                        'isDeleted' => 0,
                    ])
                    ->orderBy('nome ASC')
                    ->all();

                if (count($subtipos) > 0) {

                    $selected = null;

                    foreach ($subtipos as $i => $item) {

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

                    $selected = '';
                }

                return ['output' => $out, 'selected' => ''];
            }
        }
        return ['output' => '', 'selected' => ''];
    }


    public function actionListaEstados()
    {

        $this->responseAsJson();
        $out = [];
        $data = Yii::$app->request->post('depdrop_parents');
        $list = [];


        $nomesContextos = [];
        $idContextos = [];


        //////////////////////

        if (empty($data[0])) {

            $listaMunicipios = Contexto::find()
                ->select('municipio_id')
                ->where([
                    'active' => 1,
                ])
                ->column();

            $estados =  Estado::find()
                ->join('INNER JOIN', 'municipio', 'estado.id=municipio.estado_id')
                ->where([
                    'estado.status' => Estado::ATIVO,
                    'municipio.status' => Municipio::ATIVO,
                ])
                ->andWhere(['in', 'municipio.id', $listaMunicipios])
                ->AsArray()
                ->orderBy('nome ASC')
                ->all();


            foreach ($estados as $estado) {
                $out[] = ['id' => $estado["id"], 'name' => $estado["nome"]];
            }


            /////////

            return ['output' => $out, 'selected' => ''];
        }


        //////////////////////


        if ($data) {
            $id = end($data);
            if ($id) {

                $origem = OcorrenciaOrigem::find()
                    ->select('descricao')
                    ->where([
                        'id' => $id,
                        'isDeleted' => 0,
                    ])
                    ->column();

                if (!$origem) {
                    return ['output' => $out, 'selected' => ''];
                }

                $subsidiaria = Cliente::find()
                    ->select('id')
                    ->where([
                        'nome' => $origem,
                        'status' => 1,
                    ])
                    ->column();

                if (!$subsidiaria) {
                    return ['output' => $out, 'selected' => ''];
                }

                $listaMunicipios = Contexto::find()
                    ->select('municipio_id')
                    ->where([
                        'cliente_id' => $subsidiaria,
                        'active' => 1,
                    ])
                    ->column();

                $estados =  Estado::find()
                    ->join('INNER JOIN', 'municipio', 'estado.id=municipio.estado_id')
                    ->where([
                        'estado.status' => Estado::ATIVO,
                        'municipio.status' => Municipio::ATIVO,
                    ])
                    ->andWhere(['in', 'municipio.id', $listaMunicipios ?? []])
                    ->AsArray()
                    ->orderBy('nome ASC')
                    ->all();


                foreach ($estados as $estado) {
                    $out[] = ['id' => $estado["id"], 'name' => $estado["nome"]];
                }

                return ['output' => $out, 'selected' => ''];
                /*

                $ativo = Ativo::find()->joinWith(['origem o'])
                    ->alias('t')
                    ->join('INNER JOIN', 'contexto', 't.contexto=contexto.id')

                    ->where(['o.id' => $id])
                    ->andWhere(['t.active' => 1, 'o.isDeleted' => Status::IS_NOT_DELETED])
                    ->one();

                if ($ativo) {

                    $local = $ativo->contextoTemLocal->local;

                    if ($local->rgt - $local->lft == 1) {
                        $r = [];
                        $parents = $local->parents()->all();

                        foreach ($local->parents()->all() as $k) {
                            if ($k->active == 1) {
                                $r[] = $k->name;
                            }
                        }
                        $r = implode(" >> ", $r);
                        // $out[] = ['id' => $local->id, 'name' => $local->name];
                        $nomesContextos[] = $local->name;
                        $idContextos[] = $local->id;


                        $selected = $local->id;
                    }

                    $filhos = $local->children()->orderBy('name ASC')->all();



                    if (count($filhos) > 0) {

                        $selected = $ativo->contextoTemLocal->co_local_id;

                        foreach ($filhos as $i => $item) {

                            if ($item->active == 1) {
                                if ($item->rgt - $item->lft == 1) {

                                    $a = Local::findOne($item->id);
                                    $r = [];
                                    foreach ($a->parents()->all() as $k) {
                                        $r[] = $k->name;
                                    }
                                    $r = implode(" >> ", $r);
                                    //  $out[] = ['id' => $item->id, 'name' => $item->name];

                                    $nomesContextos[] = $item->name;

                                    $idContextos[] = $item->id;

                                    foreach ($out as $key => $row) {
                                        $id[$key] = $row['id'];
                                        $name[$key] = $row['name'];
                                    }

                                    //  array_multisort($id, SORT_ASC, $name, SORT_ASC, $out);
                                }
                            }
                        }

                        if (count($filhos) == 1) {
                            $selected = $filhos[0]['id'];
                        } else {
                            $selected = '';
                        }
                    }


                    ////////

                    $listaMunicipios = Contexto::find()
                        ->select('municipio_id')
                        ->where([
                            'active' => 1,
                        ])
                        ->andWhere(['in', 'id', $idContextos])
                        ->column();

                    //   Utils::debug($idContextos);

                    $estados =  Estado::find()
                        ->join('INNER JOIN', 'municipio', 'estado.id=municipio.estado_id')
                        ->where([
                            'estado.status' => Estado::ATIVO,
                            'municipio.status' => Municipio::ATIVO,
                        ])
                        ->andWhere(['in', 'municipio.id', $listaMunicipios])
                        ->AsArray()
                        ->orderBy('nome ASC')
                        ->all();

                    if (count($estados) > 0) {
                        foreach ($estados as $estado) {
                            $out[] = ['id' => $estado["id"], 'name' => $estado["nome"]];
                        }

                        if (count($estados) == 1) {
                            $selected = $estado[0]['id'];
                        } else {
                            $selected = '';
                        }
                    }

                    /////////

                    return ['output' => $out, 'selected' => ''];
                }
                    */
            }
        }
        return ['output' => '', 'selected' => ''];
    }

    public function actionListaEstadosSimples()
    {

        $this->responseAsJson();


        $nomesContextos = [];
        $idContextos = [];

        $listaMunicipios = Contexto::find()
            ->select('municipio_id')
            ->where([
                'active' => 1,
            ])
            ->column();

        $estados =  Estado::find()
            ->join('INNER JOIN', 'municipio', 'estado.id=municipio.estado_id')
            ->where([
                'estado.status' => Estado::ATIVO,
                'municipio.status' => Municipio::ATIVO,
            ])
            ->andWhere(['in', 'municipio.id', $listaMunicipios])
            ->AsArray()
            ->orderBy('nome ASC')
            ->all();


        foreach ($estados as $estado) {
            $out[] = ['id' => $estado["id"], 'name' => $estado["nome"]];
        }


        /////////

        return $out;
    }

    public function actionListaInstalacoesSimples()
    {

        $this->responseAsJson();
        $out = [];

        $contextos = Contexto::find()
            ->select('name')
            ->where([
                'active' => 1,
            ])
            ->column();

        $locais = Local::find()
            ->where([
                'active' => 1,
            ])
            ->andWhere(['in', 'name', $contextos])
            ->orderBy('name ASC')
            ->all();

        if (!$locais) {
            return  $out;
        }

        foreach ($locais as $local) {
            $out[] = ['id' => $local->id, 'name' => $local->name];
        }

        return  $out;
    }

    public function actionClaro() {}

    public function actionInfo($id)
    {

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

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

        if ($model) {
            return [
                'success' => true,
                'id' => $model->id,
                'cep' => $model->cep,
                'logradouro' => $model->logradouro,
                'numero' => $model->numero,
                'bairro' => $model->bairro,
                'municipio_id' => $model->municipio_id,
                'latitude' => $model->latitude,
                'longitude' => $model->longitude,
            ];
        }

        return ['success' => false];
    }

    public function actionPontuacao($id)
    {

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

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

        return [
            'pontuacao' => $contexto->pontuacao ?? 0,
            'risco_texto' => $contexto->getLgpdRiscoSoTexto(),
            'risco_cor' => $contexto->getLgpdRiscoSoCor(),
        ];
    }


    public function actionPerfil($id)
    {

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

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

        $dados = [];
        $listaNomeIndicadores = [];
        $listaValoresIndicadores = [];

        $coletaReferencia = Coleta::find()
            ->where([
                'contexto_id' => $contexto->id ?? null,
            ])
            ->andWhere(['!=', 'status', Coleta::INATIVO])
            ->orderBy('id DESC')
            ->one();

        $coletaReferenciaIndicadores = ColetaIndicador::find()
            ->select([
                'coleta_indicador.id as id',
                'coleta_indicador.nome as nome',
                'coleta_indicador.pontuacao as pontuacao',
                'coleta_indicador.vertical_indicador_id as vertical_indicador_id',
                'coleta_indicador.conceito as conceito',
                'coleta_indicador.estrutura_id as estrutura_id',
                'vertical_indicador.usa_interpolacao as usainterpolacao',
            ])
            ->joinWith(['estrutura', 'coletaAlternativas', 'verticalIndicador'])
            ->where([
                'coleta_estrutura.coleta_id' => $coletaReferencia->id ?? null,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                'coleta_indicador.status' => ColetaIndicador::ATIVO
            ])
            ->asArray()
            ->orderBy('coleta_indicador.ordem_estruturada ASC, coleta_indicador.id ASC')
            ->all();
        foreach ($coletaReferenciaIndicadores as $coletaReferenciaIndicador) {

            $listaNomeIndicadores[] = $coletaReferenciaIndicador['nome'];

            $listaValoresIndicadores[] = (int) $coletaReferenciaIndicador['pontuacao'];
        }

        return [
            'nomeindicadores' => $listaNomeIndicadores,
            'valoresindicadores' => $listaValoresIndicadores,
        ];
    }

    public function actionAreas($id)
    {

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

        $dados = [];

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

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

        $coletaReferencia = Coleta::find()
            ->where([
                'contexto_id' => $contexto->id ?? null,
            ])
            ->andWhere(['!=', 'status', Coleta::INATIVO])
            ->orderBy('id DESC')
            ->one();

        if (!$coletaReferencia) {
            return $dados;
        }

        $dados['globalValue'] = $coletaReferencia->valorGlobal;
        return $dados;
    }

    public function actionCreate($cliente_id = null)
    {

        \app\models\Base::loga("Cadastrou um novo Contexto (Cliente na LGPD)", $_GET, $_POST, 35);

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

        $licenca = new \app\models\Licenca();
        $licenca->status = Licenca::LIBERADO;
        $licenca->valor = str_replace(",", ".", \app\models\Licenca::VALOR_PADRAO);
        $msgErro = '';

        $contexto = new Contexto();

        if ($cliente_id) {
            $contexto->cliente_id = $cliente_id;
        }

        $contexto->natureza = 'Accia';

        $parceriaGpslgpd = false;



        $modulos = [];
        $modulosPossiveis = ClienteTemModulo::LISTA_MODULOS_SEM_OPERATIONAL;
        foreach ($modulosPossiveis as $k => $modulosPossivel) {

            $modulos[$k] = $modulosPossivel;
        }

        $listaModulosCliente = $modulos;

        $projetoTemVertical = new ProjetoTemVertical();

        $projeto = new Projeto();

        $contextoTemModeloRisco = new ContextoTemModeloRisco();


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

            $transaction = Yii::$app->db->beginTransaction();

            try {



                $projeto->nome = Projeto::NOME_PADRAO_LGPD;
                $projeto->cliente_id = $contexto->cliente_id;
                $projeto->contextos = null;
                $projeto->ordem = 1;
                $projeto->coleta_necessita_homologacao = 0;
                $projeto->created_by = \Yii::$app->user->identity->id ?? null;
                $projeto->status = Projeto::ATIVO;
                $projeto->created_at = date('Y-m-d H:i:s');

                if (!$projeto->save()) {
                    //Utils::debug(microtime());
                    foreach ($projeto->getErrors() as $key => $value) {
                        foreach ($value as $chave => $erro) {
                            $msgErro .= $erro . '<br />';
                        }
                    }
                    throw new HttpException(500, "1 - Erro: " . $msgErro);
                }

                $projetoTemVertical->projeto_id = $projeto->id;
                $projetoTemVertical->vertical_id = Vertical::PADRAO_LGPD;
                $projetoTemVertical->ordem = 1;
                $projetoTemVertical->status = ProjetoTemVertical::ATIVO;

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

                    foreach ($projetoTemVertical->getErrors() as $key => $value) {
                        foreach ($value as $chave => $erro) {
                            $msgErro .= $erro . '<br />';
                        }
                    }
                    throw new HttpException(500, "2 - Erro: " . $msgErro);
                }

                $connectors = Projeto::CONNECTORS;



                $riscosModelosLista = [];
                $riscoModelos =  RiscoModelo::find()
                    ->where([
                        'status' => RiscoModelo::ATIVO,
                    ])
                    ->all();
                foreach ($riscoModelos as $riscoModelo) {
                    if ($riscoModelo->verticalVinculo->status == Vertical::ATIVO) {
                        $riscosModelosLista[$riscoModelo->id] = $riscoModelo->nome;
                    }
                }

                $contexto->active = Contexto::ATIVO;

                $contexto->created_at = date('Y-m-d H:i:s');
                $contexto->cadastrado_por = Yii::$app->user->identity->id ?? null;
                $contexto->cota_disco = Contexto::COTA_PADRAO;

                $contexto->file = UploadedFile::getInstance($contexto, 'file');

                if (!$contexto->makeRoot()) {
                    throw new HttpException(500, '4 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                } else {

                    $contexto->logoFile = UploadedFile::getInstance($contexto, 'file');

                    if ($contexto->logoFile) {
                        $contexto->foto = md5(date('Ymd') . $contexto->logoFile->name) . '.' . $contexto->logoFile->extension;
                        if (!$contexto->upload()) {
                            throw new HttpException(500, "3 - Erro ao salvar a foto, motivo: " . json_encode($contexto->getErrors()));
                        }
                        if (!$contexto->save()) {
                            throw new HttpException(500, '14 - Erro ao salvar o Cliente, motivo: ' . json_encode($contexto->getErrors()));
                        }
                    }

                    \app\models\Base::loga("Criou o Cliente", $_GET, $_POST, 2, $contexto->id);
                }

                $contextoTemModeloRisco->load(Yii::$app->request->post());
                $contextoTemModeloRisco->contexto_id = $contexto->id;
                if (!$contextoTemModeloRisco->save()) {
                    throw new HttpException(500, '5a - Erro ao salvar o Modelo de Risco, motivo: ' . json_encode($contextoTemModeloRisco->getErrors()));
                }

                $projeto->codigo_pos_coleta = $projeto->projetoCodigoPosColetaOriginal;

                $projeto->load(Yii::$app->request->post());

                if (isset($connectors[$projeto->codigo_pos_coleta])) {
                    $projeto->codigo_pos_coleta = (string) $connectors[$projeto->codigo_pos_coleta];
                } else {
                    $projeto->codigo_pos_coleta = null;
                }

                $projeto->contextos = $projeto->contextos . ',' . $contexto->id;
                if (!$projeto->save()) {
                    throw new HttpException(500, '5 - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors()));
                }

                $licenca->load(Yii::$app->request->post());
                $licenca->criado_por = Yii::$app->user->identity->id ?? null;
                $licenca->criado_em = date('Y-m-d H:i:s');
                $licenca->forma_pagamento = \app\models\Licenca::FORMA_PAGSEGURO;
                $licenca->cliente_id = $contexto->cliente_id ?? null;
                $licenca->contexto_id = $contexto->id;
                $licenca->valor = str_replace(",", ".", str_replace(".", ",", str_replace(".", "", $licenca->valor)));
                $referencia = $licenca->cliente_id . '-' . time();
                $licenca->referencia = $referencia;

                if (!$licenca->save()) {
                    throw new HttpException(500, "6 - Erro licença: " . json_encode($licenca->getErrors()));
                }


                $projetoTemVertical->load(Yii::$app->request->post());

                if (!$projetoTemVertical->save()) {
                    throw new HttpException(500, "7 - Erro ao salvar a vertical no projeto, motivo: " . json_encode($projetoTemVertical->getErrors()));
                }


                $faixasPadrao = [];
                $faixasPadrao[] = ['de' => 0, 'ate' => 20, 'cor' => '#df5353'];
                $faixasPadrao[] = ['de' => 20.01, 'ate' => 80, 'cor' => '#e8dd11'];
                $faixasPadrao[] = ['de' => 80.01, 'ate' => 100, 'cor' => '#089f50'];

                foreach ($faixasPadrao as $key => $value) {

                    $projetoTemFaixa = new \app\modules\performance\models\ProjetoTemFaixa();
                    $projetoTemFaixa->projeto_id = $projeto->id;
                    $projetoTemFaixa->de = $value['de'];
                    $projetoTemFaixa->ate = $value['ate'];
                    $projetoTemFaixa->cor = $value['cor'];
                    $projetoTemFaixa->created_at = date('Y-m-d H:i:s');
                    $projetoTemFaixa->created_by = \Yii::$app->user->identity->id ?? null;

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

                        $valid = false;
                        foreach ($projetoTemFaixa->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        throw new HttpException(500, "8 - Erro: " . $msgErro);
                    }
                }


                $aplicacao = Aplicacao::find()
                    ->joinWith(['unidadeNegocio'])
                    ->where([
                        'unidade_negocio.cliente_id' => $contexto->cliente_id,
                        'aplicacao.status' => Aplicacao::ATIVO,
                    ])
                    ->one();

                if (!$aplicacao) {
                    throw new HttpException(500, "8 - Aplicação não encontrada");
                }

                $aplicacaoTemProjeto = new \app\modules\performance\models\AplicacaoTemProjeto();
                $aplicacaoTemProjeto->aplicacao_id = $aplicacao->id;
                $aplicacaoTemProjeto->projeto_id = $projeto->id;

                if (!$aplicacaoTemProjeto->save()) {
                    foreach ($aplicacaoTemProjeto->getErrors() as $key => $value) {
                        foreach ($value as $chave => $erro) {
                            $msgErro .= $erro . '<br />';
                        }
                    }
                    throw new HttpException(500, "9 - Erro: " . $msgErro);
                }

                $verticalId = null;

                $projetoTemVertical = \app\modules\performance\models\ProjetoTemVertical::find()
                    ->where(['projeto_id' => $projeto->id])
                    ->one();

                if ($projetoTemVertical) {
                    $verticalId = $projetoTemVertical->vertical_id;
                }

                if ($verticalId == Vertical::ID_INSTALACOES_CORPORATIVAS) {
                    $geraOrganograma = \app\models\Scope::geraOrganogramaInstalacoesCorporativas($contexto, $verticalId);
                    if (!$geraOrganograma) {
                        throw new HttpException(500, "12 - Erro (instalações corporativas): " . $geraOrganograma);
                    }
                }

                if ($verticalId == Vertical::ID_SE_UHE_UEO) {
                    $geraOrganograma = \app\models\Scope::geraOrganogramaSeUheUeo($contexto, $verticalId);
                    if (!$geraOrganograma) {
                        throw new HttpException(500, "12 - Erro (instalações corporativas): " . $geraOrganograma);
                    }
                }

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


                $coleta = \app\modules\performance\models\Coleta::geraColetaGenericaInicial($nome, $verticalId, $projeto->id, $contexto->id, \Yii::$app->user->identity->id, null);

                if (!$coleta) {
                    throw new HttpException(500, "10 - Erro ao criar a coleta, motivo: " . json_encode($coleta));
                }

                $geraArvore = \app\modules\performance\models\AnexoArvore::geraArvorePadrao($contexto);
                if (!$geraArvore) {
                    throw new HttpException(500, "11 - Erro: " . $geraArvore);
                }

                foreach ($contexto->modulos as $modulo) {
                    $contextoTemModulo = new ContextoTemModulo();
                    $contextoTemModulo->contexto_id = $contexto->id;
                    $contextoTemModulo->modulo = $modulo;

                    if (!$contextoTemModulo->save()) {
                        $valid = false;
                        foreach ($contextoTemModulo->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        throw new HttpException(500, "13 - Erro: " . $msgErro);
                    }
                }

                // Yii::$app->mailer->compose('_nova_licenca_audisa', [
                //     'contexto' => $contexto,
                //     'licenca' => $licenca,
                // ])
                //     ->setFrom('no-reply@krinom.com.br')
                //     ->setTo('gledson@krinom.com.br')
                //     ->setCc(['gledson@krinom.com.br'])
                //     ->setBcc(['gledson@krinom.com.br'])
                //     ->setSubject('Nova Licença ' . getenv('NOME_PLATAFORMA'))
                //     ->send();

                //desabilitado temporariamente                
                //                if ($valid) {
                //                    if ($contexto->contato_principal_email) {
                //                        Yii::$app->mailer->compose('_bemvindocontato', [
                //                                    'contexto' => $contexto,
                //                                ])
                //                                ->setFrom('no-reply@krinom.com.br')
                //                                ->setTo($contexto->contato_principal_email)
                //                                ->setBcc(['gledson@krinom.com.br'])
                //                                ->setSubject('Bem-vindo a AUDISA!')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.1. Email-Cust_Inicial.docx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.2. Analise_Regulatoria.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.3. Dimensionamento.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.4. Responsavel.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.5. DPO.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.6. Comite.xlsx')
                //                                ->attach(\Yii::getAlias('@webroot').'/uploads/1.01.7. Certificações.xlsx')                               
                //                                ->send();
                //                    }
                //                }



                $transaction->commit();

                if ($cliente_id) {
                    return $this->redirect(['/performance/cliente/view', 'id' => $cliente_id])->send();
                }

                return $this->redirect(['/performance/cliente/index'])->send();
            } catch (Exception $exception) {
                $transaction->rollBack();
                // Utils::debug($exception);
                throw new HttpException(500, $exception->getMessage());
            }
        }

        $verticais = [];
        $verticaisAtivas = Vertical::find()->where(['status' => Vertical::ATIVO])->all();
        foreach ($verticaisAtivas as $k => $verticaisAtiva) {
            $verticais[$verticaisAtiva->id] = $verticaisAtiva->nome;
        }

        $listaConnectors = Projeto::CONNECTORS_LISTA;

        $contextoNaturezas = ArrayHelper::map(
            ContextoNatureza::find()
                ->where([
                    'status' => ContextoNatureza::ATIVO,
                ])
                ->all(),
            'id',
            'nome'
        );

        $municipios = ArrayHelper::map(Municipio::find()->innerJoinWith('estado', false)->where(['municipio.status' => Municipio::ATIVO])->orderBy('estado.nome ASC, nome ASC')->all(), 'id', 'nomeEstado', 'estado.nome');

        $userAdvogado = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->all(), 'id', 'name');

        $userResponsavel = ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere(['=', 'user_has_resource.role', UserHasResource::NV_CP_CLIENTE_ADM])
            ->all(), 'id', 'name');


        $userAdmin =  ArrayHelper::map(\app\models\User::find()
            ->join('LEFT JOIN', 'auth_assignment', 'user_ceon.id=auth_assignment.user_id')
            ->where([
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->andWhere([
                'OR',
                ['=', 'auth_assignment.item_name', 'Admin'],
                ['=', 'auth_assignment.item_name', 'Admininistrador'],
            ])
            ->all(), 'id', 'name');

        $advogado = array_replace_recursive($userAdvogado, $userResponsavel, $userAdmin);

        // Utils::debug($municipios);
        return $this->render('create', [
            'contexto' => $contexto,
            'licenca' => $licenca,
            'providerCupom' => [],
            'parceriaGpslgpd' => $parceriaGpslgpd,
            'modulos' => $modulos,
            'listaModulosCliente' => $listaModulosCliente,
            'verticais' => $verticais,
            'projetoTemVertical' => $projetoTemVertical,
            'projeto' => $projeto,
            'listaConnectors' => $listaConnectors,
            'contextoTemModeloRisco' => $contextoTemModeloRisco,
            'riscosModelosLista' => [], //$riscosModelosLista
            'contextoNaturezas' => $contextoNaturezas,
            'municipios' => $municipios,
            'advogado' => $advogado,
        ]);
    }
}
