<?php

namespace app\modules\performance\models;

ini_set('memory_limit', '1024M'); // or you could use 1G

use Yii;
use yii\helpers\ArrayHelper;
use yii\helpers\StringHelper;
use app\modules\performance\models\Cliente;
use app\models\Configuracao;
use app\modules\performance\models\Projeto;
use app\modules\performance\models\Coleta;
use app\modules\performance\models\ColetaEstrutura;
use app\modules\performance\models\ColetaIndicador;
use app\modules\performance\models\ColetaAlternativa;
use app\modules\performance\models\Aplicacao;
use app\modules\performance\models\AplicacaoTemProjeto;
use app\modules\performance\models\GppTemp;
use app\models\GenericSearch;
use app\models\UserHasResource;
use app\components\Utils;
use app\models\InventarioDados;
use app\models\InventarioPergunta;
use app\models\Scope;
use \app\models\InventarioResposta;
use app\models\InventarioScope;
use app\models\Municipio;
use app\modules\risk\models\RiscoCenarioFaixa;
use app\modules\risk\models\RiscoModeloFaixa;
use Exception;
use yii\helpers\Html;
use yii\web\HttpException;

class Contexto extends \kartik\tree\models\Tree
{

	private $_dimensionamento = null;


    const ATIVO = 1;
    const INATIVO = 0;
    const MPSC_VERTICAL_SEGURANCA_PESSOAL = 49; //aws
    const RAIZ_MPSC_LOCAL_TRABALHO = 'Segurança Institucional';
    const RAIZ_MPSC_SEGURANCA_PESSOAL = 'Segurança Pessoal';
    const RAIZ_MPSC_ROOT_MEMBRO = 729; //aws
    const RAIZ_MPSC_ROOT_LOCAL_TRABALHO = 120; //aws
    const CISI_CARGO_FUNCAO_PROCURADOR = 1;
    const CISI_CARGO_FUNCAO_PROMOTOR = 2;
    const MPSC_PROCURADOES_JUSTICA = 'Procuradores de Justiça';
    const MPSC_PROMOTORES_JUSTICA = 'Promotores de Justiça';
    const PONTUACAO_CRITICA = 20;
    const PONTUACAO_NORMALIDADE = 80;
    const PONTUACAO_CRITICA_SUPERVISAO = 45;
    const PONTUACAO_NORMALIDADE_SUPERVISAO = 80;
    const ID_ORSEGUPS = 22;
    const RAIZ_ORSEGUPS_SEGURANCA_HUMANA = 15980; //aws = 1814 | local = 1814
    const RAIZ_ORSEGUPS = 15979; //aws = 1814 | local = 1814
    //const RAIZ_SANEPAR = 14523; //local
    const RAIZ_SANEPAR = 15820; //web
    const RAIZ_SANEPAR_PILOTO = 16019; //web 16019 | local 14517
    //const RAIZ_BALAROTI = 15821;
    const RAIZ_BALAROTI = 16000;
    const RAIZ_SES = 15835;
    const BALAROTI_EXCELENCIA = 1;
    const BALAROTI_MERCADO = 2;
    const BALAROTI_COMPROMETEDOR = 3;
    const EXCELENCIA = 1;
    const MERCADO = 2;
    const COMPROMETEDOR = 3;
    const RAIZ_UNIMED = 15443;
    const ID_SAUDE = 20;
    const SAUDE_EXCELENCIA = 1;
    const SAUDE_MERCADO = 2;
    const SAUDE_COMPROMETEDOR = 3;
    const ID_SEA = 15834; //local: 15450 web: 15834
    const RAIZ_OPERADORAS_SAUDE = 19701; //local: 15451 web: 19701
    const PONTUACAO_NORMALIDADE_OPERADORAS_SAUDE = 80;
    const PONTUACAO_CRITICA_OPERADORAS_SAUDE = 40;
    const PONTUACAO_NORMALIDADE_UNIMED_TUBARAO = 80;
    const PONTUACAO_CRITICA_UNIMED_TUBARAO = 40;
    const RAIZ_FEELING = 22281;
    const PONTUACAO_NORMALIDADE_FEELING = 80;
    const PONTUACAO_CRITICA_FEELING = 30;
    const ID_VIA_LGPD = 22612;
    const LGPD_CORES = [
        20 => '#df5353',
        30 => '#fe6a00',
        70 => '#e8dd11',
        80 => '#82e042',
        100 => '#089f50',
    ];
    const COTA_PADRAO = 1;

    public $clientesearch;
    public $temp;
    public $file;
    public $logoFile;
    public $temColeta;
    public $temRiscoCenario;
    public $temParecerTecnico;
    public $temRecomendacaoSeguranca;
    public $temAnexo;
    public $temFoto;
    public $temPlanoAplicacao;
    public $cisiLocalTrabalho;
    public $cisiLocalTrabalhoNome;
    public $cisiSegurancaPessoal;
    public $cisiCondicaoVulnerabilidade;
    public $cisiCargoFuncao;
    public $balarotiAuditoriaSeguranca;
    public $balarotiRelatorio;
    public $balarotiRisco;
    public $macroregiaosaude;
    public $regiaosaude;
    public $municipiosaude;
    public $orsegupsregional;
    public $sesRepassePercentual;
    public $sesRepasseValor;
    public $clienteOrigem;
    public $clienteDestino;
    public $operadorasSaudeAdvogado;
    public $operadorasSaudeJuiz;
    public $operadorasSaudeValorAcao;
    public $aplicacao;
    public $aplicacaoProjetos;
    public $municipio;
    public $historico;
    public $atributosVirtuais;
    public $lgpdAdvogado;
    public $lgpdFase;
    public $lgpdUsuario;
    public $lgpdTipoLicenca;
    public $lgpdNumeroLicenca;
    public $lgpdValorLicenca;
    public $modulos;
    public $relevancia;
    public $statusQuo;

    const TIPO_LICENCA_PROSPECCAO = 1;
    const TIPO_LICENCA_LICENCIADO = 2;
    const TIPO_LICENCA_LIST = [
        1 => 'Aguardando liberação',
        2 => 'Licenciado',
    ];

    const SCENARIO_TRIGGER = 'trigger';

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'contexto';
    }


public static function getClientesNomePorContextoIds(array $contextoIds): array
{
    $clientesNome = [];

    $contextoIds = array_filter(array_map('intval', $contextoIds));
    $contextoIds = array_values(array_unique($contextoIds));

    if (empty($contextoIds)) {
        return $clientesNome;
    }

    $rows = self::find()
        ->alias('contexto')
        ->select([
            'contexto_id' => 'contexto.id',
            'cliente_nome' => 'cliente.nome',
        ])
        ->joinWith(['cliente cliente'], false)
        ->where([
            'contexto.id' => $contextoIds,
        ])
        ->asArray()
        ->all();

    foreach ($rows as $row) {
        $contextoId = (int) $row['contexto_id'];
        $clientesNome[$contextoId] = $row['cliente_nome'] ?? '';
    }

    foreach ($contextoIds as $contextoId) {
        if (!isset($clientesNome[$contextoId])) {
            $clientesNome[$contextoId] = '';
        }
    }

    return $clientesNome;
}

public static function getUfPorContextoIds(array $contextoIds): array
{
    $ufs = [];

    $contextoIds = array_filter(array_map('intval', $contextoIds));
    $contextoIds = array_values(array_unique($contextoIds));

    if (empty($contextoIds)) {
        return $ufs;
    }

    $rows = self::find()
        ->alias('contexto')
        ->select([
            'contexto_id' => 'contexto.id',
            'uf' => 'estado.sigla',
        ])
        ->joinWith([
            'municipio0 municipio' => function ($query) {
                $query->joinWith([
                    'estado estado',
                ], false);
            },
        ], false)
        ->where([
            'contexto.id' => $contextoIds,
        ])
        ->asArray()
        ->all();

    foreach ($rows as $row) {
        $contextoId = (int) $row['contexto_id'];
        $ufs[$contextoId] = $row['uf'] ?? '';
    }

    foreach ($contextoIds as $contextoId) {
        if (!isset($ufs[$contextoId])) {
            $ufs[$contextoId] = '';
        }
    }

    return $ufs;
}

public static function getAdvogadosNomesPorContextoIds(array $contextoIds): array
{
    $nomes = [];

    $contextoIds = array_filter(array_map('intval', $contextoIds));
    $contextoIds = array_values(array_unique($contextoIds));

    if (empty($contextoIds)) {
        return $nomes;
    }

    foreach ($contextoIds as $contextoId) {
        $nomes[$contextoId] = [];
    }

    $rows = \app\models\User::find()
        ->select([
            'contexto_id' => 'user_has_resource.resource_id',
            'name' => 'user_ceon.name',
        ])
        ->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' => $contextoIds,
            'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
        ])
        ->groupBy(['user_has_resource.resource_id', 'user_ceon.id'])
        ->orderBy(['user_ceon.name' => SORT_ASC])
        ->asArray()
        ->all();

    foreach ($rows as $row) {
        $contextoId = (int) $row['contexto_id'];
        $nomes[$contextoId][] = $row['name'] ?? '';
    }

    return $nomes;
}

    public static function DimensionamentoA(array $contextoIds): array
{
    $dimensionamento = [];

    $contextoIds = array_filter(array_map('intval', $contextoIds));
    $contextoIds = array_values(array_unique($contextoIds));

    if (empty($contextoIds)) {
        return $dimensionamento;
    }

    $inventariosScope = InventarioScope::find()
        ->alias('inventario_scope')
        ->select([
            'contexto_id' => 'scope.contexto_id',
            'percentual_respondido' => 'inventario_scope.percentual_respondido',
        ])
        ->innerJoin(
            ['scope' => Scope::tableName()],
            'scope.id = inventario_scope.scope_id'
        )
        ->innerJoin(
            ['inventario_dados' => InventarioDados::tableName()],
            'inventario_dados.id = inventario_scope.inventario_dados_id'
        )
        ->where([
            'scope.contexto_id' => $contextoIds,
            'scope.status' => Scope::ATIVO,
            'inventario_dados.tipo' => InventarioDados::TIPO_DIMENSIONAMENTO,
            'inventario_dados.status' => InventarioDados::ATIVO,
        ])
        ->orderBy([
            'inventario_scope.id' => SORT_DESC,
        ])
        ->asArray()
        ->all();

    foreach ($inventariosScope as $inventarioScope) {
        $contextoId = (int) $inventarioScope['contexto_id'];

        if (isset($dimensionamento[$contextoId])) {
            continue;
        }

        $percentual = (float) ($inventarioScope['percentual_respondido'] ?? 0);

        if ($percentual == 0) {
            $dimensionamento[$contextoId] = 'Não preenchido';
        } elseif ($percentual == 100) {
            $dimensionamento[$contextoId] = 'Completo';
        } else {
            $dimensionamento[$contextoId] = 'Incompleto';
        }
    }

    foreach ($contextoIds as $contextoId) {
        if (!isset($dimensionamento[$contextoId])) {
            $dimensionamento[$contextoId] = 'Não preenchido';
        }
    }

    return $dimensionamento;
    }

    public function setDimensionamento($valor): void
    {
        $this->_dimensionamento = $valor;
    }

    public function getDimensionamento()
    {

	    return '';
        if ($this->_dimensionamento !== null) {
            return $this->_dimensionamento;
        }

        return $this->calcularDimensionamentoIndividual();
    }

    public static function carregarDimensionamentoEmLote(array $models): void
    {
        if (empty($models)) {
            return;
        }

        $contextoIds = [];

        foreach ($models as $model) {
            if (!empty($model->id)) {
                $contextoIds[] = (int) $model->id;
            }
        }

        $contextoIds = array_values(array_unique($contextoIds));

        if (empty($contextoIds)) {
            return;
        }

        /**
         * Busca todos os dimensionamentos da tela em UMA consulta.
         */
        $dimensionamentos = InventarioScope::find()
            ->alias('inventario_scope')
            ->select([
                'contexto_id' => 'scope.contexto_id',
                'percentual_respondido' => 'inventario_scope.percentual_respondido',
            ])
            ->innerJoin(
                ['scope' => Scope::tableName()],
                'scope.id = inventario_scope.scope_id'
            )
            ->innerJoin(
                ['inventario_dados' => InventarioDados::tableName()],
                'inventario_dados.id = inventario_scope.inventario_dados_id'
            )
            ->where([
                'scope.contexto_id' => $contextoIds,
                'scope.status' => Scope::ATIVO,
                'inventario_dados.tipo' => InventarioDados::TIPO_DIMENSIONAMENTO,
                'inventario_dados.status' => InventarioDados::ATIVO,
            ])
            ->orderBy([
                'inventario_scope.id' => SORT_DESC,
            ])
            ->asArray()
            ->all();

        $dimensionamentoPorContexto = [];

        foreach ($dimensionamentos as $dimensionamento) {
            $contextoId = (int) $dimensionamento['contexto_id'];

            if (!isset($dimensionamentoPorContexto[$contextoId])) {
                $dimensionamentoPorContexto[$contextoId] = $dimensionamento;
            }
        }

        /**
         * Busca os scopes específicos ativos em lote.
         * Isso serve para manter a mesma regra antiga:
         * se não existir Scope, retorna "Scope não encontrado".
         */
        $scopes = Scope::find()
            ->alias('scope')
            ->select([
                'id',
                'contexto_id',
            ])
            ->where([
                'contexto_id' => $contextoIds,
                'geral_especifico' => Scope::ESPECIFICO,
                'status' => Scope::ATIVO,
            ])
            ->orderBy([
                'id' => SORT_DESC,
            ])
            ->asArray()
            ->all();

        $scopePorContexto = [];

        foreach ($scopes as $scope) {
            $contextoId = (int) $scope['contexto_id'];

            if (!isset($scopePorContexto[$contextoId])) {
                $scopePorContexto[$contextoId] = $scope;
            }
        }

        /**
         * Verifica uma única vez se existe inventário de dimensionamento ativo.
         */
        $existeInventarioDimensionamento = InventarioDados::find()
            ->where([
                'tipo' => InventarioDados::TIPO_DIMENSIONAMENTO,
                'status' => InventarioDados::ATIVO,
            ])
            ->exists();

        foreach ($models as $model) {
		$contextoId = (int) $model->id;

		break;

            if (isset($dimensionamentoPorContexto[$contextoId])) {
                $percentual = (float) ($dimensionamentoPorContexto[$contextoId]['percentual_respondido'] ?? 0);
                $model->dimensionamento = self::statusDimensionamentoPorPercentual($percentual);
                continue;
            }

            if (!isset($scopePorContexto[$contextoId])) {
                $model->dimensionamento = 'Scope não encontrado';
                continue;
            }

            if (!$existeInventarioDimensionamento) {
                $model->dimensionamento = 'Inventário de dados não encontrado';
                continue;
            }

            $model->dimensionamento = 'Não preenchido';
        }
    }

    private static function statusDimensionamentoPorPercentual($percentual): string
    {
        $percentual = (float) $percentual;

        if ($percentual <= 0) {
            return 'Não preenchido';
        }

        if ($percentual >= 100) {
            return 'Completo';
        }

        return 'Incompleto';
    }

    private function calcularDimensionamentoIndividual(): string
    {

	    return '';
        $inventarioScope = InventarioScope::find()
            ->alias('inventario_scope')
            ->joinWith(['scope scope', 'inventarioDados inventario_dados'])
            ->where([
                'scope.contexto_id' => $this->id,
                'scope.status' => Scope::ATIVO,
                'inventario_dados.tipo' => InventarioDados::TIPO_DIMENSIONAMENTO,
                'inventario_dados.status' => InventarioDados::ATIVO,
            ])
            ->orderBy([
                'inventario_scope.id' => SORT_DESC,
            ])
            ->one();

        if (!$inventarioScope) {
            $scope = Scope::find()
                ->where([
                    'contexto_id' => $this->id,
                    'geral_especifico' => Scope::ESPECIFICO,
                    'status' => Scope::ATIVO,
                ])
                ->orderBy([
                    'id' => SORT_DESC,
                ])
                ->one();

            if (!$scope) {
                return 'Scope não encontrado';
            }

            $inventarioDados = InventarioDados::find()
                ->where([
                    'tipo' => InventarioDados::TIPO_DIMENSIONAMENTO,
                    'status' => InventarioDados::ATIVO,
                ])
                ->orderBy([
                    'id' => SORT_DESC,
                ])
                ->one();

            if (!$inventarioDados) {
                return 'Inventário de dados não encontrado';
            }

            /**
             * Importante:
             * Eu não recomendo criar registro dentro do getter.
             * Mantive separado apenas para compatibilidade com chamadas antigas.
             */
            return 'Não preenchido';
        }

        $percentual = $inventarioScope->percentual_respondido ?? 0;

        return self::statusDimensionamentoPorPercentual($percentual);
    }

    public function rules()
    {
        $rules = parent::rules();
        $rules[] = [['cliente_id', 'contexto_natureza_id'], 'required'];
        $rules[] = ['pontuacao', 'double'];
        $rules[] = [['cliente_id', 'contexto_natureza_id', 'clientesearch', 'endereco', 'cep', 'cpf_cnpj', 'latitude', 'longitude', 'taxa_substituicao', 'cadastrado_por', 'natureza', 'pontuacao', 'foto', 'contato_principal', 'cisiLocalTrabalho', 'cisiLocalTrabalhoNome', 'cisiSegurancaPessoal', 'cisiCondicaoVulnerabilidade', 'cisiCargoFuncao', 'nome_alternativo', 'sesRepassePercentual', 'sesRepasseValor', 'clienteOrigem', 'clienteDestino', 'operadorasSaudeAdvogado', 'operadorasSaudeJuiz', 'operadorasSaudeValorAcao', 'municipio', 'lgpdAdvogado', 'lgpdFase', 'contato_principal_telefone', 'relevancia', 'statusQuo'], 'safe'];
        $rules[] = [['file'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png, jpg, gif, bmp, jpeg'];
        $rules[] = [['logoFile'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png, jpg, gif, bmp, jpeg'];
        $rules[] = [['lgpdUsuario', 'modulos', 'statusQuo'], 'safe'];
        $rules[] = [['lgpdTipoLicenca', 'cota_disco', 'contexto_natureza_id'], 'integer'];
        $rules[] = ['cota_disco', 'default', 'value' => self::COTA_PADRAO];
        $rules[] = [['contato_principal_email'], 'email'];
        $rules[] = [['logradouro', 'numero', 'bairro'], 'safe'];
        $rules[] = [['municipio_id'], 'integer'];
        return $rules;
    }

    public function attributeLabels()
    {
        $labels = parent::attributeLabels();
        $labels['name'] = 'Nome';
        $labels['cliente_id'] = 'Subsidiária';
        $labels['icon_type'] = 'Tipo';
        $labels['icon'] = 'Ícone';
        $labels['clientesearch'] = 'Cliente';
        $labels['endereco'] = 'Endereço';
        $labels['cep'] = 'CEP';
        $labels['cpf_cnpj'] = 'CNPJ';
        $labels['latitude'] = 'Latitude';
        $labels['longitude'] = 'Longitude';
        $labels['taxa_substituicao'] = 'Taxa de Substituição';
        $labels['cadastrado_por'] = 'Cadastrado por';
        $labels['natureza'] = 'Natureza';
        $labels['pontuacao'] = 'Pontuação';
        $labels['foto'] = 'Foto';
        $labels['contato_principal'] = 'Nome do contato';
        $labels['cisiLocalTrabalho'] = 'Local de Trabalho';
        $labels['cisiLocalTrabalhoNome'] = 'Local de Trabalho';
        $labels['cisiSegurancaPessoal'] = 'Segurança Pessoal';
        $labels['cisiCondicaoVulnerabilidade'] = 'Condição de Vulnerabilidade';
        $labels['cisiCargoFuncao'] = 'Cargo/Função';
        $labels['nome_alternativo'] = 'Nome alternativo';
        $labels['sesRepassePercentual'] = 'Percentual';
        $labels['sesRepasseValor'] = 'Repasse';
        $labels['operadorasSaudeAdvogado'] = 'Advogado';
        $labels['operadorasSaudeJuiz'] = 'Juiz';
        $labels['operadorasSaudeValorAcao'] = 'Valor da ação';
        $labels['search'] = 'Pesquisa';
        $labels['aplicacao'] = 'Aplicação';
        $labels['municipio'] = 'Município';
        $labels['lgpdAdvogado'] = 'Advogado';
        $labels['lgpdFase'] = 'Fase';
        $labels['lgpdUsuario'] = 'Usuários';
        $labels['cota_disco'] = 'Espaço em disco';
        $labels['contato_principal_telefone'] = 'Telefone do contato';
        $labels['contato_principal_email'] = 'Email do contato';
        $labels['logoFile'] = 'Logo';
        $labels['contexto_natureza_id'] = 'Natureza';
        $labels['relevancia'] = 'Relevância';
        $labels['statusQuo'] = 'Status Quo';
        $labels['logradouro'] = 'Logradouro';
        $labels['numero'] = 'Número';
        $labels['bairro'] = 'Bairro';
        $labels['municipio_id'] = 'Município/UF';


        return $labels;
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getClienteNome()
    {
        $c = Cliente::findOne($this->cliente_id);
        if (!$c) {
            return null;
        }
        return $c->nome;
        //return $this->hasOne(Contexto::className(), ['id' => 'sco_contexto_id']);
    }

    public function getClienteNomeName()
    {
        //        $c = Cliente::findOne($this->cliente);
        //        if (!$c) {
        //            return null;
        //        }

        $name = $this->name;

        if ($this->nome_alternativo) {
            $name = $this->nome_alternativo;
        }

        return $this->cliente->nome . ' - ' . $name;
        //return $this->hasOne(Contexto::className(), ['id' => 'sco_contexto_id']);
    }

    public function getCliente()
    {
        return $this->hasOne(Cliente::className(), ['id' => 'cliente_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getContextoTemContatos()
    {
        return $this->hasMany(ContextoTemContato::className(), ['contexto_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getContextoTemParametros()
    {
        return $this->hasMany(ContextoTemParametro::className(), ['contexto_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getContextoTemServicos()
    {
        return $this->hasMany(ContextoTemServico::className(), ['contexto_id' => 'id']);
    }

    public function getCadastrado_por()
    {
        return $this->hasOne(\dektrium\user\models\User::className(), ['id' => 'cadastrado_por']);
    }

    public function getMunicipio0()
    {
        return $this->hasOne(Municipio::className(), ['id' => 'municipio_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getColetas()
    {
        return $this->hasMany(Coleta::className(), ['contexto_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMembros()
    {
        return $this->hasMany(MpscMembroLocal::className(), ['local_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getLocal()
    {
        return $this->hasOne(MpscMembroLocal::className(), ['membro_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getOrsegupsContextoPostos()
    {
        return $this->hasMany(OrsegupsContextoPosto::className(), ['contexto_id' => 'id']);
    }


    public function getEstrutura()
    {
        return $this->id;
    }

    public function getValorGlobal()
    {
        
     $coleta = Coleta::find()
            ->join('left join', 'projeto', 'coleta.projeto_id = projeto.id')
            ->join('left join', 'vertical', 'projeto.vertical_id = vertical.id')
            ->where([
                'coleta.contexto_id' => $this->id,
                'coleta.status' => Coleta::ATIVO,
            ])
            ->orderBy('coleta.id DESC')
            ->one();
        
        if (!$coleta) {
            return null;
        }
        return $coleta->valorGlobal;
        
        //        if ($this->id == self::ID_SEA) {
        //            return str_replace(".", ",", round(($this->pontuacao + 29.99) * 0.507202015));
        //        }
        //return str_replace(".", ",", $this->pontuacao);
    }

    public function getValorGlobal30()
    {

        $coleta30 = Coleta::find()
            // ->joinWith('projeto')
            ->join('left join', 'projeto', 'coleta.projeto_id = projeto.id')
            ->join('left join', 'vertical', 'projeto.vertical_id = vertical.id')
            ->where([
                'coleta.contexto_id' => $this->id,
                'coleta.status' => Coleta::ATIVO,
                'vertical.regra' => Vertical::REGRA_DIARIA,
            ])
            ->orderBy('coleta.id DESC')
            ->one();
        //Utils::debug($coleta30);
        if (!$coleta30) {
            return null;
        }
        return $coleta30->valorGlobal;
    }

    public function getValorGlobalSegurancaPessoal()
    {

        $coletaSP = Coleta::find()
            // ->joinWith('projeto')
            ->join('left join', 'projeto', 'coleta.projeto_id = projeto.id')
            ->join('left join', 'vertical', 'projeto.vertical_id = vertical.id')
            ->where([
                'coleta.contexto_id' => $this->id,
                'coleta.status' => Coleta::ATIVO,
                'vertical.id' => self::MPSC_VERTICAL_SEGURANCA_PESSOAL,
            ])
            ->orderBy('coleta.id DESC')
            ->one();


        if ($coletaSP) {
            return (string) $coletaSP->valorGlobal;
        }

        return 'N/D';
    }

    public function getValorGlobalCor()
    {

        $bg = '#ebebeb';


        $pontuacao = str_replace(",", ".", $this->valorGlobal);

        if ((float) $pontuacao == 0) {
            return "#DF5353";
        }

        if (!$pontuacao) {
            return '#ebebeb';
        }
        $niveisValorGlobal = [];

        $tem = false;

        //pesquisando cliente       
        $faixasCliente = ClienteTemFaixa::find()
            ->where([
                'cliente_id' => $this->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\BaseModel::faixasPadrao();
        }

        if ($this->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 ($this->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"];
        }

        if ($this->cliente_id == self::ID_SEA) {
            $niveisValorGlobal = [];
            $niveisValorGlobal[] = ["from" => 0, "to" => 15, "color" => "#DF5353"];
            $niveisValorGlobal[] = ["from" => 16, "to" => 65, "color" => "#e8dd11"];
            $niveisValorGlobal[] = ["from" => 66, "to" => 10, "color" => "#089f50"];
        }

        foreach ($niveisValorGlobal as $key => $value) {
            if ($pontuacao >= $value["from"] && $pontuacao <= $value["to"]) {
                $bg = $value["color"];
            }
        }

        return $bg;
    }

    public function getValorGlobal30Cor()
    {

        $bg = '#ebebeb';

        $coleta30 = Coleta::find()
            //->joinWith('projeto')
            ->join('left join', 'projeto', 'coleta.projeto_id = projeto.id')
            ->join('left join', 'vertical', 'projeto.vertical_id = vertical_id')
            ->where([
                'coleta.contexto_id' => $this->id,
                'coleta.status' => Coleta::ATIVO,
                'vertical.regra' => Vertical::REGRA_DIARIA,
            ])
            ->orderBy('coleta.id DESC')
            ->one();

        if (!$coleta30) {
            $pontuacao = null;
        } else {
            $pontuacao = $coleta30->valorGlobal;
        }


        if (!$pontuacao) {
            return '#ebebeb';
        }
        $niveisValorGlobal = [];

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

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

        if ($configuracaoNiveisValorGlobal) {
            $niveisValorGlobal = json_decode($configuracaoNiveisValorGlobal->valor, true);
        }

        foreach ($niveisValorGlobal as $key => $value) {
            if ($pontuacao >= $value["from"] && $pontuacao <= $value["to"]) {
                $bg = $value["color"];
            }
        }

        return $bg;
    }

    public function getValorGlobalSegurancaPessoalCor()
    {

        $bg = '#ebebeb';

        $coletaSP = Coleta::find()
            // ->joinWith('projeto')
            ->join('left join', 'projeto', 'coleta.projeto_id = projeto.id')
            ->join('left join', 'vertical', 'projeto.vertical_id = vertical.id')
            ->where([
                'coleta.contexto_id' => $this->id,
                'coleta.status' => Coleta::ATIVO,
                'vertical.id' => self::MPSC_VERTICAL_SEGURANCA_PESSOAL,
            ])
            ->orderBy('coleta.id DESC')
            ->one();


        if (!$coletaSP) {
            $pontuacao = null;
        } else {
            $pontuacao = $coletaSP->valorGlobal;
        }


        if ($pontuacao == 0) {
            return '#DF5353';
        }

        if (!$pontuacao) {
            return '#ebebeb';
        }
        $niveisValorGlobal = [];

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

        //        $configuracaoNiveisValorGlobal = Configuracao::find()->where(['chave' => 'plotBandGaugePrincipal', 'status' => Configuracao::ATIVO])->one();
        //
        //        if ($configuracaoNiveisValorGlobal) {
        //            $niveisValorGlobal = json_decode($configuracaoNiveisValorGlobal->valor, true);
        //        }

        foreach ($niveisValorGlobal as $key => $value) {
            if ($pontuacao >= $value["from"] && $pontuacao <= $value["to"]) {
                $bg = $value["color"];
            }
        }

        return $bg;
    }

    public function getValorGlobalName()
    {

        return $this->valorGlobal . ' - ' . $this->name;
    }

    public function getNameAlternativo()
    {

        $name = $this->name;

        if ($this->nome_alternativo) {
            $name = $this->nome_alternativo;
        }

        return $name;
    }

    public function getPai()
    {

        if ($this->lvl == 0) {
            return '';
        }

        $pai = $this->parents(1)->one();

        //    $pai = $this->owner->find()->where(['lft' => $this->owner->getAttribute($this->leftAttribute) - 1])->andwhere(['=', 'root', $this->owner->getAttribute($this->treeAttribute)])->one();
        //        $root = $this->root;
        //
        //        $lvl = $this->lvl - 1;
        //
        //        $pai = self::find()->where(['root' => $root, 'lvl' => $lvl, 'active' => self::ATIVO])->one();

        if ($pai) {
            return $pai->name;
        }

        return 'N/D';
    }

    public function getValorGlobalRisco()
    {

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

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

        if ($cenario) {

            return (string) $cenario->pontuacao;
        } else {
            return 'N/D';
        }
    }

    public function getValorGlobalRiscoCor()
    {

        $bg = '#f4f4f4';

        $pontuacao = $this->valorGlobalRisco;

        if ($pontuacao == 'N/D') {
            return $bg;
        }

        $niveisValorGlobalRisco = [];

        $niveisValorGlobalRisco[] = ["from" => -50, "to" => 20, "color" => "#089f50"];
        $niveisValorGlobalRisco[] = ["from" => 21, "to" => 30, "color" => "#82e042"];
        $niveisValorGlobalRisco[] = ["from" => 31, "to" => 70, "color" => "#e8dd11"];
        $niveisValorGlobalRisco[] = ["from" => 71, "to" => 80, "color" => "#fe6a00"];
        $niveisValorGlobalRisco[] = ["from" => 81, "to" => 200, "color" => "#DF5353"];



        //        $configuracaoNiveisValorGlobalRisco = Configuracao::find()->where(['chave' => 'plotBandRisco', 'status' => Configuracao::ATIVO])->one();
        //
        //        if ($configuracaoNiveisValorGlobalRisco) {
        //            $niveisValorGlobalRisco = json_decode($configuracaoNiveisValorGlobalRisco->valor, true);
        //        }

        foreach ($niveisValorGlobalRisco as $key => $value) {
            if ($pontuacao >= $value["from"] && $pontuacao <= $value["to"]) {
                $bg = $value["color"];
            }
        }

        return $bg;
    }

    public function upload()
    {

        if ($this->validate()) {

            $nome = md5(date('Ymd') . $this->logoFile->name);

            $this->logoFile->saveAs('img/logo/' . $nome . '.' . $this->logoFile->extension, false);
            return true;
        } else {
            return false;
        }
    }

    public static function geraPontuacao($model)
    {

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

        if ($coleta) {
            $model->pontuacao = $coleta->valorGlobal;
        } else {
            //\app\component\Comunica::telegram('Gerando Pontuação para o Contexto ' . $model->name);
            //verificando se é membro
            $membros = [];

            if (in_array($model->id, $membros)) {

                $pontuacaoLocalMembro = intval($model->localColeta);

                $pontuacaoColetaMembro = 0;

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

                if ($coletaMembro) {
                    $pontuacaoColetaMembro = $coletaMembro->valorGlobal;
                }

                $pontuacaoRiscoMembro = 100 - intval($model->valorGlobalRisco);

                $model->pontuacao = round(((25 * $pontuacaoLocalMembro) / 100) + ((25 * $pontuacaoColetaMembro) / 100) + ((50 * $pontuacaoRiscoMembro) / 100));
            } else {


                //contexto com risco
                if ($model->valorGlobalRisco != 'N/D') {

                    $totalProjetoSemColeta = 0;
                    $taxaProjetoSemColeta = 0;
                    $totalTaxaUsada = 0;
                    $pontuacaoColeta = 0;
                    $pontuacaoRisco = 0;
                    $projeto = null;
                    $resultado = 0;
                    $p = [];

                    $coletasProjeto = Coleta::find()
                        ->joinWith('projeto')
                        ->where([
                            'coleta.contexto_id' => $model->id,
                            'coleta.status' => Coleta::ATIVO
                        ])
                        ->groupBy('coleta.projeto_id')
                        ->all();
                    foreach ($coletasProjeto as $coletaProjeto) {

                        $totalTaxaUsada += $coletaProjeto->projeto->taxa_substituicao;
                        if (!$coletaProjeto->projeto->taxa_substituicao) {
                            $totalProjetoSemColeta++;
                        }
                    }


                    $taxaProjetoSemColeta = (100 - (int) $totalTaxaUsada) / ($totalProjetoSemColeta + 1);


                    $coletas = Coleta::find()
                        ->where([
                            'contexto_id' => $model->id,
                            'status' => Coleta::ATIVO,
                        ])
                        ->orderBy('vertical_id ASC, projeto_id ASC, coleta.id DESC')
                        ->all();

                    foreach ($coletas as $coleta) {

                        if ($coleta->projeto->taxa_substituicao) {
                            $taxa = $coleta->projeto->taxa_substituicao;
                        } else {
                            $taxa = $taxaProjetoSemColeta;
                        }
                        $p[] = [$taxa, $coleta->valorGlobal];

                        if ($coleta->valorGlobal) {
                            $resultado = $coleta->valorGlobal * ($taxa / 100);
                        } else {
                            $resultado = (int) $coleta->valorGlobal * ($taxa / 100);
                        }

                        $pontuacaoColeta += $resultado;
                    }

                    $pontuacaoRisco = (100 - $model->valorGlobalRisco) * ($taxaProjetoSemColeta / 100);

                    $model->pontuacao = $pontuacaoColeta + $pontuacaoRisco;

                    //$pontuacao = round($pontuacaoColeta + $pontuacaoRisco);
                } else {
                    //contexto sem risco

                    $totalProjetoSemColeta = 0;
                    $taxaProjetoSemColeta = 0;
                    $totalTaxaUsada = 0;
                    $pontuacaoColeta = 0;
                    $projeto = null;
                    $resultado = 0;

                    $coletasProjeto = Coleta::find()
                        ->joinWith('projeto')
                        ->where([
                            'coleta.contexto_id' => $model->id,
                            'coleta.status' => Coleta::ATIVO
                        ])
                        ->groupBy('coleta.projeto_id')
                        ->all();
                    foreach ($coletasProjeto as $coletaProjeto) {
                        $totalTaxaUsada += $coletaProjeto->projeto->taxa_substituicao;
                        if (!$coletaProjeto->projeto->taxa_substituicao) {
                            $totalProjetoSemColeta++;
                        }
                    }

                    if ($totalProjetoSemColeta > 0) {
                        $taxaProjetoSemColeta = (100 - (int) $totalTaxaUsada) / $totalProjetoSemColeta;
                    }

                    $coletas = Coleta::find()
                        ->where([
                            'contexto_id' => $model->id,
                            'status' => Coleta::ATIVO,
                        ])
                        ->orderBy('vertical_id ASC, projeto_id ASC, coleta.id DESC')
                        ->all();

                    foreach ($coletas as $coleta) {

                        if ($coleta->projeto_id != $projeto) {
                            if ($coleta->projeto->taxa_substituicao) {
                                $taxa = $coleta->projeto->taxa_substituicao;
                            } else {
                                $taxa = $taxaProjetoSemColeta;
                            }

                            if ($coleta->valorGlobal) {
                                $resultado = $coleta->valorGlobal * ($taxa / 100);
                            } else {
                                $resultado = (int) $coleta->valorGlobal * ($taxa / 100);
                            }

                            $pontuacaoColeta += $resultado;

                            $projeto = $coleta->projeto_id;
                        }
                    }

                    $model->pontuacao = $pontuacaoColeta;
                }
            }
        }

        if ($model->root != self::RAIZ_SES) {
            $model->pontuacao = round($model->pontuacao);
        }

        if ($model->id == 19629) {
            $model->pontuacao = 71;
        }
        //\app\component\Comunica::telegram('pontuação final coleta: ' . $pontuacaoColeta. ', pontuacao risco' . $pontuacaoRisco);
        if (!$model->save()) {
            \app\component\Comunica::telegram("Erro ao salvar a pontuação do contexto, motivo: " . json_encode($model->getErrors()));
            throw new \yii\base\Exception("Erro ao salvar a pontuação do contexto, motivo: " . json_encode($model->getErrors()));
        }

        //\app\component\Comunica::telegram('Fim da Pontuação para o Contexto ' . $model->name);
        return true;
    }

    public static function geraPontuacaoEstrutura($model)
    {

        return true;
        $estruturaAsc = $model->parents()->all();

        $estrutuaDesc = array_reverse($estruturaAsc);

        foreach ($estrutuaDesc as $itemEstrutura) {

            if ($itemEstrutura->active == self::ATIVO) {

                $filhos = $itemEstrutura->children(1)->all();

                $taxaNull = 0;

                $totalTaxafilhos = 0;

                $totalFilhos = 0;

                foreach ($filhos as $filho) {

                    if ($filho->active == self::ATIVO) {

                        $totalTaxafilhos += (int) $filho->taxa_substituicao;
                        $totalFilhos++;
                    }
                }
                if ($totalFilhos == 0) {
                    $totalFilhos = 1;
                }

                $taxaNull = (100 - $totalTaxafilhos) / $totalFilhos;

                $pontuacao = 0;

                foreach ($filhos as $filho) {

                    if ($filho->active == self::ATIVO) {

                        if ($filho->taxa_substituicao) {
                            $taxaFilho = $filho->taxa_substituicao;
                        } else {
                            $taxaFilho = $taxaNull;
                        }

                        if (($filho->rgt - $filho->lft) == 1) {

                            $pontuacaoContextoAtualizada = self::geraPontuacao($filho);
                        }

                        $pontuacao += ($filho->pontuacao * $taxaFilho) / 100;
                    }
                }

                $itemEstrutura->pontuacao = $pontuacao;

                if (!$itemEstrutura->save()) {
                    throw new \yii\base\Exception("Erro ao salvar a pontuação do item da estrutura " . $itemEstrutura->name . ", motivo: " . json_encode($itemEstrutura->getErrors()));
                }
            }
        }
        //Utils::debug($pontuacao);
        return true;
    }

    public function getNameCirculoCor()
    {

        $nome = $this->nome_alternativo ? $this->nome_alternativo : $this->name;

        return $nome . ' <span><i class="fa fa-circle" style="color:' . $this->valorGlobalCor . '"></i></span>';
    }

    public function getCirculoCorName()
    {

        $nome = $this->nome_alternativo ? $this->nome_alternativo : $this->name;

        return '<span><i class="fa fa-circle" style="color:' . $this->valorGlobalCor . '"></i></span> ' . $nome;
    }

    public static function corrigeLabel($contexto, $label, $parametrosLabel = [])
    {

        if (isset($parametrosLabel[$label])) {
            return $parametrosLabel[$label];
        }

        //        //contexto é mais importante
        //        $parametroContexto = ContextoTemParametro::find()
        //                ->where([
        //                    'tipo' => ContextoTemParametro::LABEL,
        //                    'contexto_id' => $contexto->id,
        //                    'parametro' => $label,
        //                    'status' => ContextoTemParametro::ATIVO
        //                ])
        //                ->one();
        //
        //        if ($parametroContexto) {
        //            return $parametroContexto->informacao;
        //        }
        //
        //        $parametro = ClienteTemParametro::find()
        //                ->where([
        //                    'tipo' => ClienteTemParametro::LABEL,
        //                    'cliente_id' => $contexto->cliente_id,
        //                    'parametro' => $label,
        //                    'status' => ClienteTemParametro::ATIVO
        //                ])
        //                ->one();
        //
        //        if ($parametro) {
        //            return $parametro->valor;
        //        }

        return $label;
    }

    public function getRaiz()
    {

        $raiz = null;

        $raiz = self::find()->where(['id' => $this->root])->one();

        return $raiz;
    }

    public function getRaizName()
    {

        $retorno = null;

        $raiz = $this->raiz;

        if ($raiz) {
            return $raiz->name;
        }
    }

    //util para MPSC
    public function getLocalColeta()
    {

        $local = MpscMembroLocal::find()->where(['membro_id' => $this->id])->one();

        if (!$local) {
            return 'Sem local';
        }

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

        if (!$coleta) {
            return 'Sem coleta';
        }

        return (string) $coleta->valorGlobal;
    }

    public static function InsereContextoOrsegups($contexto, $endereco, $cliente, $cep, $businessUnit, $posto)
    {

        //latlng
        //enderecoLatLng
        $enderecoLatLng = str_replace("-", "+", str_replace("/", "+", str_replace(" ", "+", $endereco)));
        $urlLatLng = "https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyCIYsuKS5ThokB-XSVaphSbQI3cLWCl2qE&address=" . $enderecoLatLng;
        $curlLatLng = curl_init($urlLatLng);
        curl_setopt($curlLatLng, CURLOPT_RETURNTRANSFER, true);
        $resultLatLng = curl_exec($curlLatLng);
        $resultLatLng = json_decode($resultLatLng, true);

        $lat = '';
        $lng = '';
        if (isset($resultLatLng['results'])) {
            if (isset($resultLatLng['results'][0])) {
                if (isset($resultLatLng['results'][0]['geometry'])) {
                    if (isset($resultLatLng['results'][0]['geometry']['location'])) {
                        if (isset($resultLatLng['results'][0]['geometry']['location']['lat'])) {
                            $lat = $resultLatLng['results'][0]['geometry']['location']['lat'];
                        }
                        if (isset($resultLatLng['results'][0]['geometry']['location']['lng'])) {
                            $lng = $resultLatLng['results'][0]['geometry']['location']['lng'];
                        }
                    }
                }
            }
        }

        //natureza
        $natureza = 'Segurança Empresarial';
        $nome = $cliente["nome"];

        $pattern = '/COND/'; //Padrão a ser encontrado na string $tags
        if (preg_match($pattern, $cliente["nome"])) {
            $natureza = 'Segurança Condominial';
        }

        $pattern = '/cond/'; //Padrão a ser encontrado na string $tags
        if (preg_match($pattern, $cliente["nome"])) {
            $natureza = 'Segurança Condominial';
        }

        $pattern = '/EDIFICI/'; //Padrão a ser encontrado na string $tags
        if (preg_match($pattern, $cliente["nome"])) {
            $natureza = 'Segurança Condominial';
        }

        $pattern = '/edifici/'; //Padrão a ser encontrado na string $tags
        if (preg_match($pattern, $cliente["nome"])) {
            $natureza = 'Segurança Condominial';
        }

        if (in_array($cliente["id"], [535, 536])) {
            $natureza = 'Segurança Educacional';
            $nomeExp = explode("-", $posto['name']);
            $nome = $nomeExp[0];
        }

        $contexto->name = $nome;
        $contexto->cliente_id = self::ID_ORSEGUPS;
        $contexto->endereco = $endereco;
        $contexto->cep = $cep;
        $contexto->cadastrado_por = 1;
        $contexto->natureza = $natureza;
        $contexto->latitude = $lat;
        $contexto->longitude = $lng;


        $ref = \app\models\ContextoTemParametro::find()
            ->where([
                'parametro' => 'Business Unit External Id',
                'informacao' => $businessUnit,
            ])
            ->one();
        if ($ref) {
            $pai = \app\models\Contexto::findOne($ref->contexto_id);
        } else {
            $pai = \app\models\Contexto::findOne(Contexto::RAIZ_ORSEGUPS_SEGURANCA_HUMANA);
        }

        $contexto->appendTo($pai);

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

        return $contexto;
    }

    public static function permiteAcessar($model)
    {

        //permissões
        //se iscliente e responsavel pelo cliente
        //se iscliente e nao responsavel pelo cliente
        //se possui permissão de ver coleta do contexto

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

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

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

                $responsavel = false;
                if (isset($_SESSION['responsavel'])) {
                    if (in_array($model->cliente_id, $_SESSION['responsavel'])) {
                        $responsavel = true;
                    }
                }

                if (!$responsavel) {
                    if ($_SESSION['todosContextos'] == 'nao') {

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

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

        return true;
    }

    public function getBalarotiAuditoriaSeguranca()
    {

        $coleta = Coleta::find()
            ->where([
                'contexto_id' => $this->id,
                'projeto_id' => Projeto::ID_PROJETO_BALAROTI_AUDITORIA_SEGURANCA,
                'status' => Coleta::ATIVO
            ])
            ->one();
        if (!$coleta) {
            return 'N/D';
        }

        return $coleta->valorGlobal;
    }

    public function getBalarotiRelatorio()
    {

        $coleta = Coleta::find()
            ->where([
                'contexto_id' => $this->id,
                'projeto_id' => Projeto::ID_PROJETO_BALAROTI_RELATORIO,
                'status' => Coleta::ATIVO
            ])
            ->one();
        if (!$coleta) {
            return 'N/D';
        }

        return $coleta->valorGlobal;
    }

    public function getRecuperaParametro($tipo, $parametro)
    {

        $resultado = ContextoTemParametro::find()
            ->where([
                'contexto_id' => $this->id,
                'tipo' => ContextoTemParametro::GERAL,
                'parametro' => $parametro,
                'status' => ContextoTemParametro::ATIVO,
            ])
            ->one();

        if ($resultado) {
            return $resultado->informacao;
        }

        return 'N/D';
    }

    public static function repasseSaudePercentual($model, $politica)
    {

        $retorno = 'N/D';

        if (isset($politica[$model->natureza])) {

            $dados = $politica[$model->natureza];

            $retorno = $dados[0]['percentual'] . '%';

            foreach ($dados as $dado) {

                if ($model->pontuacao == str_replace(",", ".", $dado['pontuacao'])) {
                    $retorno = $dado['percentual'] . '%';
                    break;
                }

                if ($model->pontuacao >= str_replace(",", ".", $dado['pontuacao'])) {
                    break;
                }

                $retorno = $dado['percentual'] . '%';
            }
        }
        return $retorno;
    }

    public static function repasseSaudeValor($model, $politica, $valorPadrao)
    {

        $retorno = 'N/D';

        if (isset($politica[$model->natureza])) {

            $dados = $politica[$model->natureza];

            $percentual = $dados[0]['percentual'];

            foreach ($dados as $dado) {

                if ($model->pontuacao == str_replace(",", ".", $dado['pontuacao'])) {
                    $percentual = $dado['percentual'];
                    break;
                }

                if ($model->pontuacao >= str_replace(",", ".", $dado['pontuacao'])) {
                    break;
                }

                $percentual = $dado['percentual'];
            }

            if (isset($valorPadrao[$model->natureza])) {
                $retorno = $valorPadrao[$model->natureza] * ($percentual / 100);
            }

            return Yii::$app->formatter->asCurrency($retorno);
        }
        return $retorno;
    }

    public function getDataAtualizacao()
    {

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

        if ($coleta) {
            return date('d/m/Y H:i', strtotime($coleta->created_at));
        }

        return 'N/D';
    }

    public static function recuperaGlobalCor($coleta)
    {

        $bg = '#ebebeb';

        $pontuacao = $coleta->valorGlobal;

        $contexto = $coleta->contexto;

        $projeto = $coleta->projeto;

        if ($pontuacao == 0) {
            return "#DF5353";
        }

        if (!$pontuacao) {
            return '#ebebeb';
        }
        $niveisValorGlobal = [];

        $tem = false;

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

        //pesquisando projeto       
        $faixasProjeto = \app\modules\performance\models\ProjetoTemFaixa::find()
            ->where([
                'projeto_id' => $projeto->id,
            ])
            ->all();
        if ($faixasProjeto) {
            $tem = true;
            $niveisValorGlobal = [];
            foreach ($faixasProjeto as $faixa) {
                $niveisValorGlobal[] = ["from" => $faixa->de, "to" => $faixa->ate, "color" => $faixa->cor];
            }
        }

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

        if ($contexto->cliente_id == \app\modules\performance\models\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 ($contexto->cliente_id == \app\modules\performance\models\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"];
        }

        if ($contexto->cliente_id == self::ID_SEA) {
            $niveisValorGlobal = [];
            $niveisValorGlobal[] = ["from" => 0, "to" => 15, "color" => "#DF5353"];
            $niveisValorGlobal[] = ["from" => 16, "to" => 65, "color" => "#e8dd11"];
            $niveisValorGlobal[] = ["from" => 66, "to" => 10, "color" => "#089f50"];
        }

        foreach ($niveisValorGlobal as $key => $value) {
            if ($pontuacao >= $value["from"] && $pontuacao <= $value["to"]) {
                $bg = $value["color"];
            }
        }

        return $bg;
    }

    /*
     * CEON
     */

    /**
     * @return array
     */
    // public function attributeIcons()
    // {
    //     return [
    //         'id' => 'fas fa-hashtag',
    //         'name' => 'fas fa-info',
    //         'cpf_cnpj' => 'fas fa-hashtag',
    //         'natureza' => 'fas fa-list',
    //         'status' => 'fas fa-toggle-on',
    //         'created_by' => 'far fa-user',
    //         'created_at' => 'fas fa-user-clock',
    //         'search' => 'fas fa-search',
    //         'pontuacao' => 'fas fa-hashtag',
    //         'aplicacao' => 'fas fa-list',
    //         'cep' => 'fas fa-mail-bulk',
    //         'endereco' => 'fas fa-map-marker-alt',
    //         'contato_principal' => 'fas fa-user',
    //     ];
    // }

    /**
     * @param $attribute
     * @return mixed|string
     */
    public function getAttributeIcon($attribute)
    {
        return $this->attributeIcons()[$attribute] ?? '';
    }

    /**
     * @param $attribute
     * @return mixed|string
     */
    public function getAttributeLabel($attribute)
    {
        return $this->attributeLabels()[$attribute] ?? '';
    }

    public function getAplicacoesContexto()
    {

        $projetos = Projeto::find()
            ->select('id')
            ->where([
                'cliente_id' => $this->cliente_id,
                'status' => Projeto::ATIVO
            ])
            ->andWhere([
                'or',
                ['like', 'contextos', $this->id],
                ['like', 'contextos', '*']
            ])
            ->column();
        if (empty($projetos)) {
            return 'N/D';
        }

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

        $retorno = '<ul>';
        foreach ($aplicacoes as $aplicacoes) {
            $retorno .= '<li>' . $aplicacoes->nome . '</li>';
        }
        $retorno .= '</ul>';

        return $retorno;
    }

    public static function dadosAvaliacaoDesempenho($contexto, $aplicacao, $models, $minimoMercado = 0, $minimoExcelencia = 100, $origem = 'default')
    {

        //models são dados de coletas

        $dados = [];
        $datas = [];
        $nomes = [];
        $coletas = [];
        $ordens = [];
        $pontuacoes = [];
        $ordem = 0;
        $exibir = true;
        $minimo = 0;
        $maximo = 0;
        $evolucao = '0%';
        $indicadores = [];
        $totalIndicadores = 0;
        $dadosSparkLine = [];
        $minimoAreaPreocupacao = 0;
        $maximoAreaPreocupacao = 0;
        $dadosAbsolutoIndicadores = null;

        if (count($models) > 1) {

            if ($models[max(array_keys($models))]->valorGlobal == 0) {
                $percentual = 0;
            } else {

                $percentual = round((((int) $models[0]->valorGlobal / (int) $models[max(array_keys($models))]->valorGlobal) - 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;
        }

        $verticalPeriodicidade = Vertical::PERIODO_UNICO;
        foreach ($models as $model) { //models sao coletas
            //Utils::debug([$model, next($models)]);
            $ordens[$ordem] = $model->id;

            $datas[$model->id] = $model->data_coleta;

            $nomes[$model->id] = $model->nome;

            $valorGlobal = self::valorGlobalAplicacao($contexto, $aplicacao, null, $model);
            //$valorGlobal = $model->valorGlobal;

            $pontuacoes[$model->id] = $valorGlobal;

            $iconeValorGlobal = Cliente::valorGlobalIcone($contexto->cliente, $valorGlobal);

            $indicadoresColeta = ColetaIndicador::find()
                ->joinwith('verticalIndicador')
                ->joinWith('estrutura')
                ->where([
                    'coleta_indicador.status' => ColetaIndicador::ATIVO,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_estrutura.coleta_id' => $model->id,
                ])
                ->orderBy('coleta_indicador.ordem_estruturada ASC')
                ->all();

            $totalIndicadores = count($indicadoresColeta);
            $grupoIndicadores = [];
            $grupoIndicadoresComprometedor = 0;
            $grupoIndicadoresMercado = 0;
            $grupoIndicadoresExcelencia = 0;
            $indicadoresComprometedor = [];
            $indicadoresMercado = [];
            $indicadoresExcelencia = [];
            $percentualIndicadoresComprometedor = 0;
            $percentualIndicadoresMercado = 0;
            $percentualIndicadoresExcelencia = 0;
            $m = 0;
            $percentualModelo = 0;

            $percentualModelo = ColetaIndicador::percentualDoModelo($model, $indicadoresColeta);

            $gppTemp = ArrayHelper::map(GppTemp::find()->all(), 'vertical_indicador_id', 'id');

            $indicadorSemInterpolacao = [];

            foreach ($indicadoresColeta as $indicadorColeta) {

                if ($indicadorColeta->vertical_indicador_id && $indicadorColeta->verticalIndicador->usa_interpolacao == false) {
                    $indicadorSemInterpolacao[] = $indicadorColeta->verticalIndicador->id;
                }

                //if ($indicadorColeta->pontuacao) {
                $dadosSparkLine[$indicadorColeta->vertical_indicador_id][] = $indicadorColeta->pontuacao;
                //}


                if ($indicadorColeta->pontuacao <= $minimoMercado) {
                    //if ($indicadorColeta->pontuacao < ColetaIndicador::PONTUACAO_MINIMA_MERCADO) {

                    $indicadoresComprometedor[] = [
                        'id' => $indicadorColeta->id,
                        'nome' => $indicadorColeta->nome,
                        'evolucao' => 0,
                        'pontuacao' => $indicadorColeta->pontuacao,
                        'minimo' => $indicadorColeta->minimo,
                        'maximo' => $indicadorColeta->maximo,
                        'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                        'ordem' => $m,
                        'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                        'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                        'plano_acao' => isset($gppTemp[$indicadorColeta->vertical_indicador_id]),
                        'dados_absolutos' => $indicadorColeta->dadosAbsoluto,
                    ];

                    $grupoIndicadoresComprometedor++;
                } elseif ($indicadorColeta->pontuacao >= $minimoExcelencia) {

                    $indicadoresExcelencia[] = [
                        'id' => $indicadorColeta->id,
                        'nome' => $indicadorColeta->nome,
                        'evolucao' => 0,
                        'pontuacao' => $indicadorColeta->pontuacao,
                        'minimo' => $indicadorColeta->minimo,
                        'maximo' => $indicadorColeta->maximo,
                        'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                        'ordem' => $m,
                        'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                        'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                        'plano_acao' => isset($gppTemp[$indicadorColeta->vertical_indicador_id]),
                        'dados_absolutos' => $indicadorColeta->dadosAbsoluto,
                    ];

                    $grupoIndicadoresExcelencia++;
                } else {

                    $indicadoresMercado[] = [
                        'id' => $indicadorColeta->id,
                        'nome' => $indicadorColeta->nome,
                        'evolucao' => 0,
                        'pontuacao' => $indicadorColeta->pontuacao,
                        'minimo' => $indicadorColeta->minimo,
                        'maximo' => $indicadorColeta->maximo,
                        'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                        'ordem' => $m,
                        'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                        'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                        'plano_acao' => isset($gppTemp[$indicadorColeta->vertical_indicador_id]),
                        'dados_absolutos' => $indicadorColeta->dadosAbsoluto,
                    ];
                    $grupoIndicadoresMercado++;
                }

                if (!isset($dadosAbsolutoIndicadores[$indicadorColeta->vertical_indicador_id])) {
                    $dadosAbsolutoIndicadores[$indicadorColeta->vertical_indicador_id] = $indicadorColeta->getDadosAbsoluto();
                }
                $m++;
            }

            //            foreach ($indicadoresComprometedor as $key => $row) {
            //                $ids[$key] = $row['id'];
            //                $nomes[$key] = $row['nome'];
            //                $evolucaos[$key] = $row['evolucao'];
            //                $pontuacaos[$key] = $row['pontuacao'];
            //                $taxa_substituicaos[$key] = $row['taxa_substituicao'];
            //                $ordens[$key] = $row['ordem'];
            //                $percentualModelos[$key] = $row['percentualModelo'];
            //                $vertical_indicador_ids[$key] = $row['vertical_indicador_id'];
            //            }
            //
            //           array_multisort($percentualModelos, SORT_DESC, $ids, SORT_ASC, $indicadoresComprometedor);

            $percentualIndicadoresComprometedor = 0;
            if ($totalIndicadores > 0) {
                $percentualIndicadoresComprometedor = round((($grupoIndicadoresComprometedor / $totalIndicadores) * 100), 2);
            }
            $indicadores['comprometedor'] = [
                'total' => $grupoIndicadoresComprometedor,
                'percentual' => str_replace(".", ",", $percentualIndicadoresComprometedor),
                'indicadores' => $indicadoresComprometedor,
            ];

            $percentualIndicadoresMercado = 0;
            if ($totalIndicadores > 0) {
                $percentualIndicadoresMercado = round((($grupoIndicadoresMercado / $totalIndicadores) * 100), 2);
            }
            $indicadores['mercado'] = [
                'total' => $grupoIndicadoresMercado,
                'percentual' => str_replace(".", ",", $percentualIndicadoresMercado),
                'indicadores' => $indicadoresMercado,
            ];

            $percentualIndicadoresExcelencia = 100 - $percentualIndicadoresMercado - $percentualIndicadoresComprometedor;
            $indicadores['excelencia'] = [
                'total' => $grupoIndicadoresExcelencia,
                'percentual' => str_replace(".", ",", $percentualIndicadoresExcelencia),
                'indicadores' => $indicadoresExcelencia,
            ];

            $grupoIndicadores = [
                'comprometedor' => $grupoIndicadoresComprometedor,
                'mercado' => $grupoIndicadoresMercado,
                'excelencia' => $grupoIndicadoresExcelencia,
            ];

            $plots = [];

            $faixasPadrao = $model->faixasPadrao;

            foreach ($faixasPadrao as $k => $f) {

                list($r, $g, $b) = sscanf($f['color'], "#%02x%02x%02x");

                $plots[] = ['from' => $f['from'], 'to' => $f['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];

                if ($f['from'] < $minimo) {
                    $minimo = $f['from'];
                }

                if ($f['to'] > $maximo) {
                    $maximo = $f['to'];
                }
            }

            $dadosPerfilDesempenho = json_decode(json_encode($model->dadosPerfilDesempenho), true);
            if (!isset($dadosPerfilDesempenho['xy'])) {
                $dadosPerfilDesempenho = $coleta->dadosPerfilDesempenho;
            }


            if (isset($dadosPerfilDesempenho['xy'])) {
                $xy = $dadosPerfilDesempenho['xy'];
            } else {
                $xy = $coleta->dadosPerfilDesempenho['xy'];
            }

            if (isset($dadosPerfilDesempenho['y'])) {
                $y = $dadosPerfilDesempenho['y'];
            } else {
                $y = $coleta->dadosPerfilDesempenho['y'];
            }

            if (isset($dadosPerfilDesempenho['x'])) {
                $x = $dadosPerfilDesempenho['x'];
            } else {
                $x = $coleta->dadosPerfilDesempenho['x'];
            }

            $dadosDescritorEstruturaAlternativa = json_decode($model->dados_descritor_estrutura_alternativa, true);

            if (isset($dadosDescritorEstruturaAlternativa['dados'])) {
                $descritorEstruturaAlternativa = $dadosDescritorEstruturaAlternativa['dados'];
            } else {
                $descritorEstruturaAlternativa = $model->getDescritorEstruturaAlternativa($indicadoresColeta, $faixasPadrao);
            }

            $estruturas = Coleta::estrutura($model, false, $origem, $faixasPadrao);

            if ($model->dados_areas_preocupacao) {
                $areasPreocupacao = json_decode($model->dados_areas_preocupacao, true);
            } else {
                $areasPreocupacao = $model->getAreasPreocupacao($indicadoresColeta, $faixasPadrao);
            }

            foreach ($areasPreocupacao['dadospve'] as $n1) {
                foreach ($n1['data'] as $n2) {
                    if ($n2['y'] < $minimoAreaPreocupacao) {
                        $minimoAreaPreocupacao = $n2['y'];
                    }
                    if ($n2['y'] > $maximoAreaPreocupacao) {
                        $maximoAreaPreocupacao = $n2['y'];
                    }
                }
            }

            $coletas[$model->id] = [
                'id' => $model->id,
                'nome' => $model->nome,
                'pontuacao' => $valorGlobal,
                'iconeValorGlobal' => $iconeValorGlobal,
                'evolucao' => $evolucao,
                'data_coleta' => date('d/m/Y', strtotime($model->data_coleta)),
                'projeto_id' => $model->projeto_id,
                'cor' => $model->valorGlobalCor,
                'pvf' => $model->pvf,
                'areasPreocupacao' => $areasPreocupacao,
                'estruturas' => $estruturas,
                'indicadores' => $indicadores,
                'totalIndicadores' => $totalIndicadores,
                'grupoIndicadores' => $grupoIndicadores,
                'plots' => $plots,
                'data' => $xy,
                'datay' => $y,
                'datax' => $x,
                'descritorEstruturaAlternativa' => $descritorEstruturaAlternativa,
                'label' => $model->nome,
                'showLine' => $exibir,
                'indicadorSemInterpolacao' => $indicadorSemInterpolacao,
            ];
            if ($model->vertical_id) {
                if ($model->vertical->periodicidade == Vertical::PERIODO_DIARIO) {
                    $verticalPeriodicidade = $model->vertical->periodicidade;
                }
            }

            $ordem++;
            $exibir = false;
        }

        if ($minimoAreaPreocupacao > -50) {
            $minimoAreaPreocupacao = -50;
        }

        if ($maximoAreaPreocupacao < 150) {
            $maximoAreaPreocupacao = 150;
        }

        $dados['contexto'] = $contexto->id;
        $dados['total'] = count($coletas);
        $dados['ordem'] = $ordens;
        $dados['nomes'] = $nomes;
        $dados['pontuacoes'] = $pontuacoes;
        $dados['datas'] = $datas;
        $dados['dadosSparkLine'] = $dadosSparkLine;
        $dados['coletas'] = $coletas;
        $dados['minimo'] = $minimo;
        $dados['maximo'] = $maximo;
        $dados['minimoAreaPreocupacao'] = $minimoAreaPreocupacao;
        $dados['maximoAreaPreocupacao'] = $maximoAreaPreocupacao;
        $dados['verticalPeriodicidade'] = $verticalPeriodicidade;
        $dados['dadosAbsolutoIndicadores'] = $dadosAbsolutoIndicadores;

        return $dados;
    }

    public static function retornaDesempenhoPadrao($modelId)
    {

        $model = self::findOne($modelId);

        return '<div style="width:100%; line-height:40px; vertical-align: inherit;text-align:center;color:white; font-weight: bold; font-size: 15px;background-color:' . $model->valorGlobalCor . '">' . $model->pontuacao . '</div>';
    }

    public static function retornaDesempenhoOperadorasSaude($modelId)
    {

        $model = self::findOne($modelId);

        if ($model->pontuacao >= self::PONTUACAO_NORMALIDADE_OPERADORAS_SAUDE) {
            return '<div style="text-align:center; padding: 3px; background-color:#089F50">Favorável</div>';
        }
        if ($model->pontuacao <= self::PONTUACAO_CRITICA_OPERADORAS_SAUDE) {
            return '<div style="text-align:center; padding: 3px; background-color:#DF5353">Desfavorável</div>';
        }

        return '<div style="text-align:center; padding: 3px; background-color:#E8DD11">Análise</div>';
    }

    public static function filtroNaturezaOperadorasSaude()
    {

        $raiz = Contexto::findOne(Contexto::RAIZ_OPERADORAS_SAUDE);

        $contextos = $raiz
            ->children()
            ->andWhere('rgt-lft=1')
            ->andWhere('active=1')
            ->all();

        $naturezas = [];

        foreach ($contextos as $contexto) {

            $naturezas[$contexto->natureza] = $contexto->natureza;
        }

        ksort($naturezas, SORT_NATURAL | SORT_FLAG_CASE);
        return $naturezas;
    }

    public static function filtroAdvogadoOperadorasSaude()
    {

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

        $contextos = $raiz
            ->children()
            ->andWhere('rgt-lft=1')
            ->andWhere('active=1')
            ->all();

        $contextosId = [];

        foreach ($contextos as $contexto) {
            $contextosId[] = $contexto->id;
        }

        $advogados = \yii\helpers\ArrayHelper::map(\app\modules\performance\models\ContextoTemParametro::find()
            ->where([
                'parametro' => 'Advogado',
                'status' => \app\modules\performance\models\ContextoTemParametro::ATIVO
            ])
            ->andWhere(['in', 'contexto_id', $contextosId])
            ->all(), 'informacao', 'informacao');

        ksort($advogados, SORT_NATURAL | SORT_FLAG_CASE);

        return $advogados;
    }

    public static function filtroJuizOperadorasSaude()
    {

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

        $contextos = $raiz
            ->children()
            ->andWhere('rgt-lft=1')
            ->andWhere('active=1')
            ->all();

        $contextosId = [];

        foreach ($contextos as $contexto) {
            $contextosId[] = $contexto->id;
        }

        $juizes = \yii\helpers\ArrayHelper::map(\app\modules\performance\models\ContextoTemParametro::find()
            ->where([
                'parametro' => 'Juiz',
                'status' => \app\modules\performance\models\ContextoTemParametro::ATIVO
            ])
            ->andWhere(['in', 'contexto_id', $contextosId])
            ->all(), 'informacao', 'informacao');

        ksort($juizes, SORT_NATURAL | SORT_FLAG_CASE);

        return $juizes;
    }

    public static function retornaRegionaisSupervisaoSeguranca()
    {

        $raiz = Contexto::findOne(Contexto::RAIZ_ORSEGUPS_SEGURANCA_HUMANA);

        $regionaisTodas = $raiz
            ->children(1)
            ->andWhere([
                'active' => Contexto::ATIVO
            ])
            ->orderBy('nome_alternativo ASC, name ASC')
            ->all();

        $regionais = [];
        foreach ($regionaisTodas as $regional) {
            if ($regional->nome_alternativo) {
                $regionais[$regional->id] = $regional->nome_alternativo;
            } else {
                $regionais[$regional->id] = $regional->name;
            }
        }

        return $regionais;
    }

    public static function regionalSupervisaoSeguranca($modelId)
    {

        $model = self::findOne($modelId);

        $regional = $model->parents(1)->andwhere('id!=1817')->orderBy('lft ASC')->one();
        if (!$regional) {
            $regional1 = $model->parents(1)->orderBy('lft ASC')->one();
            if (!$regional1) {
                return 'N/D';
            }
            return $regional1->nome_alternativo ? $regional1->nome_alternativo : $regional1->name;
        }
        return $regional->nome_alternativo ? $regional->nome_alternativo : $regional->name;
    }

    public static function valorGlobalAplicacao($contexto, $aplicacao, $coletas, $coleta)
    {

        if ($coleta) {
            return $coleta->getValorGlobal();
        }

        if ($coletas[0]) {
            return $coletas[0]->getValorGlobal();
        }

        return null;
    }

    public function getUltimaColeta()
    {

        $coleta = Coleta::find()
            ->where([
                'contexto_id' => $this->id,
                'status' => Coleta::ATIVO
            ])
            ->andWhere(['is not', 'data_coleta', new \yii\db\Expression('null')])
            ->one();

        return $coleta;
    }

    public function getUltimaColetaAplicacao($projetos)
    {

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

        return $coleta;
    }

    public function getHistoricoAplicacao($projetos)
    {

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

        $retorno = [];
        foreach ($coletas as $coleta) {
            $retorno[] = $coleta->valorGlobal;
        }
        return $retorno;
    }

    public function gestorContexto($params)
    {

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

        if (!$contexto) {
            return false;
        }

        $aplicacao = null;
        if (isset($params['aplicacao_id'])) {
            $aplicacao = Aplicacao::find()
                ->where([
                    'id' => $params['aplicacao_id'],
                    'status' => Aplicacao::ATIVO,
                ])
                ->one();
        }
        if (!$aplicacao) {
            return false;
        }

        $userHasResource = \app\models\UserHasResource::find()
            ->where([
                'user_id' => \Yii::$app->user->identity->id ?? null,
                'role' => \app\models\UserHasResource::NV_CP_APLICACAO_ADM,
                'resource_id' => $aplicacao->id,
            ])
            ->one();

        if ($userHasResource) {
            return true;
        }

        $cliente = Cliente::find()
            ->where([
                'id' => $aplicacao->unidadeNegocio->cliente_id,
                'status' => Cliente::ATIVO,
            ])
            ->one();

        if (!$cliente) {
            return false;
        }

        $userHasResource = \app\models\UserHasResource::find()
            ->where([
                'user_id' => \Yii::$app->user->identity->id ?? null,
                'role' => \app\models\UserHasResource::NV_CP_CLIENTE_ADM,
                'resource_id' => $cliente->id,
            ])
            ->one();

        if ($userHasResource) {
            return true;
        }


        return \app\models\GenericSearch::filterMyContextos()
            ->query
            ->andWhere(['id' => $contexto->id])
            ->exists();
    }

    public static function visualizadorContexto($params)
    {

        $contexto = self::find()->where([
            'id' => $params['id'] ?? null,
            'active' => self::ATIVO,
        ])
            ->one();

        if (!$contexto) {
            return false;
        }

        $aplicacao = null;
        if (isset($params['aplicacao_id'])) {
            $aplicacao = Aplicacao::find()
                ->where([
                    'id' => $params['aplicacao_id'],
                    'status' => Aplicacao::ATIVO,
                ])
                ->one();
        }
        if (!$aplicacao) {
            return false;
        }

        $userHasResource = \app\models\UserHasResource::find()
            ->where([
                'user_id' => \Yii::$app->user->identity->id ?? null,
                'role' => \app\models\UserHasResource::NV_CP_APLICACAO_VIEW,
                'resource_id' => $aplicacao->id,
            ])
            ->one();

        if ($userHasResource) {
            return true;
        }

        $cliente = Cliente::find()
            ->where([
                'id' => $aplicacao->unidadeNegocio->cliente_id,
                'status' => Cliente::ATIVO,
            ])
            ->one();

        if (!$cliente) {
            return false;
        }

        $userHasResource = \app\models\UserHasResource::find()
            ->where([
                'user_id' => \Yii::$app->user->identity->id ?? null,
                'role' => \app\models\UserHasResource::NV_CP_CLIENTE_VIEW,
                'resource_id' => $cliente->id,
            ])
            ->one();

        if ($userHasResource) {
            return true;
        }


        return \app\models\GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->andWhere(['contexto.id' => $contexto->id])
            ->exists();
    }

    public static function acessaMulti()
    {

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

        //Utils::debug($contextosVisualizacao);

        if (count($contextosVisualizacao) > 1) {
            return true;
        } else {
            return false;
        }

        //        $recursos = \app\models\UserHasResource::find()
        //                ->select('resource_id')
        //                ->where([
        //                    'user_id' => \Yii::$app->user->identity->id ?? null,
        //                    'role' => \app\models\UserHasResource::NV_CP_CONTEXTO_ADM,
        //                ])
        //                ->column();
        //
        //        if (count($recursos) > 1) {
        //            return true;
        //        }
        //
        //        $contexto = Contexto::find()
        //                ->where([
        //                    'id' => $recursos[0],
        //                    'active' => Contexto::ATIVO,
        //                ])
        //                ->one();
        //
        //        $projetosTodosContextos = Projeto::find()
        //                ->select('id')
        //                ->where([
        //                    'cliente_id' => $contexto->cliente_id,
        //                    'contextos' => '*',
        //                    'status' => Projeto::ATIVO
        //                ])
        //                ->column();
        //
        //        $projetosContexto = Projeto::find()
        //                ->select('id')
        //                ->where([
        //                    'cliente_id' => $contexto->cliente_id,
        //                    'status' => Projeto::ATIVO
        //                ])
        //                ->andWhere(['OR',
        //                    ['like', 'contextos', $contexto->id . ','],
        //                    ['=', 'contextos', $contexto->id],
        //                ])
        //                ->column();
        //
        //        $projetos = array_merge($projetosTodosContextos, $projetosContexto);
        //
        //        $aplicacoes = Aplicacao::find()
        //                ->select('aplicacao.id')
        //                ->joinWith('aplicacaoTemProjetos')
        //                ->where([
        //                    'aplicacao.status' => Aplicacao::ATIVO,
        //                ])
        //                ->andWhere(['in', 'aplicacao_tem_projeto.projeto_id', $projetos])
        //                ->column();
        //
        //        if (count($aplicacoes) > 1) {
        //            return true;
        //        }
        //
        //        return false;
    }

    public static function acessaMultiVisualizador()
    {

        $recursos = \app\models\UserHasResource::find()
            ->select('resource_id')
            ->where([
                'user_id' => \Yii::$app->user->identity->id ?? null,
                'role' => \app\models\UserHasResource::NV_CP_CONTEXTO_VIEW,
            ])
            ->column();

        if (count($recursos) > 1) {
            return true;
        }

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

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

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

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

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

        if (count($aplicacoes) > 1) {
            return true;
        }

        return false;
    }

    public static function retornaDesempenhoUnimedTubarao($modelId)
    {

        $model = self::findOne($modelId);

        if ($model->pontuacao >= self::PONTUACAO_NORMALIDADE_UNIMED_TUBARAO) {
            return '<div style="text-align:center; padding: 3px; background-color:#089F50">Favorável</div>';
        }
        if ($model->pontuacao <= self::PONTUACAO_CRITICA_UNIMED_TUBARAO) {
            return '<div style="text-align:center; padding: 3px; background-color:#DF5353">Desfavorável</div>';
        }

        return '<div style="text-align:center; padding: 3px; background-color:#E8DD11">Análise</div>';
    }

    public function getSituacao()
    {

        $referencias = [
            'maximo_comprometedor' => self::PONTUACAO_CRITICA,
            'maximo_mercado' => self::PONTUACAO_NORMALIDADE,
        ];

        if ($this->cliente_id == 31) {
            $referencias = [
                'maximo_comprometedor' => 40,
                'maximo_mercado' => 80,
            ];
        }
        if ($this->cliente_id == \app\modules\performance\models\Cliente::ID_SEA) {
            $referencias = [
                'maximo_comprometedor' => 15,
                'maximo_mercado' => 65,
            ];
        }

        $valorGlobal = $this->valorGlobal;

        if (!$valorGlobal) {
            return [
                'texto' => \app\modules\performance\models\Aplicacao::API_TEXTO_SEM_VALORGLOBAL,
                'cor' => \app\modules\performance\models\Aplicacao::API_COR_SEM_VALORGLOBAL,
                'cor_fundo' => \app\modules\performance\models\Aplicacao::API_COR_FUNDO_SEM_VALORGLOBAL,
                'cor_fonte' => \app\modules\performance\models\Aplicacao::API_COR_FONTE_SEM_VALORGLOBAL,
            ];
        }

        if ((float) $valorGlobal <= $referencias['maximo_comprometedor']) {
            return [
                'texto' => \app\modules\performance\models\Aplicacao::API_TEXTO_COMPROMETEDOR,
                'cor' => \app\modules\performance\models\Aplicacao::API_COR_COMPROMETEDOR,
                'cor_fundo' => \app\modules\performance\models\Aplicacao::API_COR_FUNDO_COMPROMETEDOR,
                'cor_fonte' => \app\modules\performance\models\Aplicacao::API_COR_FONTE_COMPROMETEDOR,
            ];
        }

        if ((float) $valorGlobal <= $referencias['maximo_mercado']) {
            return [
                'texto' => \app\modules\performance\models\Aplicacao::API_TEXTO_MERCADO,
                'cor' => \app\modules\performance\models\Aplicacao::API_COR_MERCADO,
                'cor_fundo' => \app\modules\performance\models\Aplicacao::API_COR_FUNDO_MERCADO,
                'cor_fonte' => \app\modules\performance\models\Aplicacao::API_COR_FONTE_MERCADO,
            ];
        }

        return [
            'texto' => \app\modules\performance\models\Aplicacao::API_TEXTO_EXCELENCIA,
            'cor' => \app\modules\performance\models\Aplicacao::API_COR_EXCELENCIA,
            'cor_fundo' => \app\modules\performance\models\Aplicacao::API_COR_FUNDO_EXCELENCIA,
            'cor_fonte' => \app\modules\performance\models\Aplicacao::API_COR_FONTE_EXCELENCIA,
        ];
    }

    public static function dadosAvaliacaoDesempenhoApi($contexto, $aplicacao, $models, $minimoMercado = 0, $minimoExcelencia = 100)
    {

        //models são dados de coletas

        $dados = [];
        $datas = [];
        $nomes = [];
        $coletas = [];
        $ordens = [];
        $pontuacoes = [];
        $ordem = 0;
        $exibir = true;
        $minimo = 0;
        $maximo = 0;
        $evolucao = '0%';
        $indicadores = [];
        $totalIndicadores = 0;
        $dadosSparkLine = [];
        $minimoAreaPreocupacao = 0;
        $maximoAreaPreocupacao = 0;

        if (count($models) > 1) {
            $percentual = round((((int) $models[0]->valorGlobal / (int) $models[max(array_keys($models))]->valorGlobal) - 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;
        }


        foreach ($models as $model) { //models sao coletas
            //Utils::debug([$model, next($models)]);
            $ordens[$ordem] = $model->id;

            $datas[$model->id] = $model->data_coleta;

            $nomes[$model->id] = $model->nome;

            $valorGlobal = self::valorGlobalAplicacao($contexto, $aplicacao, null, $model);
            //$valorGlobal = $model->valorGlobal;

            $pontuacoes[$model->id] = $valorGlobal;

            $iconeValorGlobal = Cliente::valorGlobalIcone($contexto->cliente, $valorGlobal);

            $indicadoresColeta = ColetaIndicador::find()
                ->joinWith('estrutura')
                ->where([
                    'coleta_indicador.status' => ColetaIndicador::ATIVO,
                    'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                    'coleta_estrutura.coleta_id' => $model->id,
                ])
                ->orderBy('coleta_indicador.ordem_estruturada ASC')
                ->all();

            $totalIndicadores = count($indicadoresColeta);
            $grupoIndicadores = [];
            $grupoIndicadoresComprometedor = 0;
            $grupoIndicadoresMercado = 0;
            $grupoIndicadoresExcelencia = 0;
            $indicadoresComprometedor = [];
            $indicadoresMercado = [];
            $indicadoresExcelencia = [];
            $percentualIndicadoresComprometedor = 0;
            $percentualIndicadoresMercado = 0;
            $percentualIndicadoresExcelencia = 0;
            $m = 0;
            $percentualModelo = 0;


            $percentualModelo = ColetaIndicador::percentualDoModelo($model, $indicadoresColeta);

            foreach ($indicadoresColeta as $indicadorColeta) {

                //if ($indicadorColeta->pontuacao) {
                $dadosSparkLine[$indicadorColeta->vertical_indicador_id][] = $indicadorColeta->pontuacao;
                //}


                if ($indicadorColeta->pontuacao <= $minimoMercado) {
                    //if ($indicadorColeta->pontuacao < ColetaIndicador::PONTUACAO_MINIMA_MERCADO) {

                    $indicadoresComprometedor[] = [
                        'id' => $indicadorColeta->id,
                        'nome' => $indicadorColeta->nome,
                        'evolucao' => 0,
                        'pontuacao' => $indicadorColeta->pontuacao,
                        'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                        'ordem' => $m,
                        'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                        'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                    ];

                    $grupoIndicadoresComprometedor++;
                } elseif ($indicadorColeta->pontuacao >= $minimoExcelencia) {

                    $indicadoresExcelencia[] = [
                        'id' => $indicadorColeta->id,
                        'nome' => $indicadorColeta->nome,
                        'evolucao' => 0,
                        'pontuacao' => $indicadorColeta->pontuacao,
                        'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                        'ordem' => $m,
                        'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                        'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                    ];

                    $grupoIndicadoresExcelencia++;
                } else {

                    $indicadoresMercado[] = [
                        'id' => $indicadorColeta->id,
                        'nome' => $indicadorColeta->nome,
                        'evolucao' => 0,
                        'pontuacao' => $indicadorColeta->pontuacao,
                        'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                        'ordem' => $m,
                        'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                        'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                    ];
                    $grupoIndicadoresMercado++;
                }

                $m++;
            }

            //            foreach ($indicadoresComprometedor as $key => $row) {
            //                $ids[$key] = $row['id'];
            //                $nomes[$key] = $row['nome'];
            //                $evolucaos[$key] = $row['evolucao'];
            //                $pontuacaos[$key] = $row['pontuacao'];
            //                $taxa_substituicaos[$key] = $row['taxa_substituicao'];
            //                $ordens[$key] = $row['ordem'];
            //                $percentualModelos[$key] = $row['percentualModelo'];
            //                $vertical_indicador_ids[$key] = $row['vertical_indicador_id'];
            //            }
            //
            //           array_multisort($percentualModelos, SORT_DESC, $ids, SORT_ASC, $indicadoresComprometedor);

            $percentualIndicadoresComprometedor = round((($grupoIndicadoresComprometedor / $totalIndicadores) * 100), 2);
            $indicadores['comprometedor'] = [
                'total' => $grupoIndicadoresComprometedor,
                'percentual' => str_replace(".", ",", $percentualIndicadoresComprometedor),
                'indicadores' => $indicadoresComprometedor,
            ];

            $percentualIndicadoresMercado = round((($grupoIndicadoresMercado / $totalIndicadores) * 100), 2);
            $indicadores['mercado'] = [
                'total' => $grupoIndicadoresMercado,
                'percentual' => str_replace(".", ",", $percentualIndicadoresMercado),
                'indicadores' => $indicadoresMercado,
            ];

            $percentualIndicadoresExcelencia = 100 - $percentualIndicadoresMercado - $percentualIndicadoresComprometedor;
            $indicadores['excelencia'] = [
                'total' => $grupoIndicadoresExcelencia,
                'percentual' => str_replace(".", ",", $percentualIndicadoresExcelencia),
                'indicadores' => $indicadoresExcelencia,
            ];

            $grupoIndicadores = [
                'comprometedor' => $grupoIndicadoresComprometedor,
                'mercado' => $grupoIndicadoresMercado,
                'excelencia' => $grupoIndicadoresExcelencia,
            ];

            $plots = [];

            $faixasPadrao = $model->faixasPadrao;

            foreach ($faixasPadrao as $k => $f) {

                list($r, $g, $b) = sscanf($f['color'], "#%02x%02x%02x");

                $plots[] = ['from' => $f['from'], 'to' => $f['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];

                if ($f['from'] < $minimo) {
                    $minimo = $f['from'];
                }

                if ($f['to'] > $maximo) {
                    $maximo = $f['to'];
                }
            }

            $dadosPerfilDesempenho = json_decode(json_encode($model->dadosPerfilDesempenho), true);
            if (!isset($dadosPerfilDesempenho['xy'])) {
                $dadosPerfilDesempenho = $coleta->dadosPerfilDesempenho;
            }


            if (isset($dadosPerfilDesempenho['xy'])) {
                $xy = $dadosPerfilDesempenho['xy'];
            } else {
                $xy = $coleta->dadosPerfilDesempenho['xy'];
            }

            if (isset($dadosPerfilDesempenho['y'])) {
                $y = $dadosPerfilDesempenho['y'];
            } else {
                $y = $coleta->dadosPerfilDesempenho['y'];
            }

            if (isset($dadosPerfilDesempenho['x'])) {
                $x = $dadosPerfilDesempenho['x'];
            } else {
                $x = $coleta->dadosPerfilDesempenho['x'];
            }

            $dadosDescritorEstruturaAlternativa = json_decode($model->dados_descritor_estrutura_alternativa, true);

            if (isset($dadosDescritorEstruturaAlternativa['dados'])) {
                $descritorEstruturaAlternativa = $dadosDescritorEstruturaAlternativa['dados'];
            } else {
                $descritorEstruturaAlternativa = $model->getDescritorEstruturaAlternativa($indicadoresColeta, $faixasPadrao);
            }

            $estruturas = Coleta::estrutura($model, false);

            if ($model->dados_areas_preocupacao) {
                $areasPreocupacao = json_decode($model->dados_areas_preocupacao, true);
            } else {
                $areasPreocupacao = $model->getAreasPreocupacao($indicadoresColeta, $faixasPadrao);
            }

            foreach ($areasPreocupacao['dadospve'] as $n1) {
                foreach ($n1['data'] as $n2) {
                    if ($n2['y'] < $minimoAreaPreocupacao) {
                        $minimoAreaPreocupacao = $n2['y'];
                    }
                    if ($n2['y'] > $maximoAreaPreocupacao) {
                        $maximoAreaPreocupacao = $n2['y'];
                    }
                }
            }

            $coletas[$model->id] = [
                'id' => $model->id,
                'nome' => $model->nome,
                'pontuacao' => $valorGlobal,
                'iconeValorGlobal' => $iconeValorGlobal,
                'evolucao' => $evolucao,
                'data_coleta' => date('d/m/Y', strtotime($model->data_coleta)),
                'projeto_id' => $model->projeto_id,
                'cor' => $model->valorGlobalCor,
                'pvf' => $model->pvf,
                'areasPreocupacao' => $areasPreocupacao,
                'estruturas' => $estruturas,
                'indicadores' => $indicadores,
                'totalIndicadores' => $totalIndicadores,
                'grupoIndicadores' => $grupoIndicadores,
                'plots' => $plots,
                'data' => $xy,
                'datay' => $y,
                'datax' => $x,
                'descritorEstruturaAlternativa' => $descritorEstruturaAlternativa,
                'label' => $model->nome,
                'showLine' => $exibir,
            ];
            $ordem++;
            $exibir = false;
        }

        if ($minimoAreaPreocupacao > -50) {
            $minimoAreaPreocupacao = -50;
        }

        if ($maximoAreaPreocupacao < 150) {
            $maximoAreaPreocupacao = 150;
        }

        $dados['total'] = count($coletas);
        $dados['ordem'] = $ordens;
        $dados['nomes'] = $nomes;
        $dados['pontuacoes'] = $pontuacoes;
        $dados['datas'] = $datas;
        $dados['dadosSparkLine'] = $dadosSparkLine;
        $dados['coletas'] = $coletas;
        $dados['minimo'] = $minimo;
        $dados['maximo'] = $maximo;
        $dados['minimoAreaPreocupacao'] = $minimoAreaPreocupacao;
        $dados['maximoAreaPreocupacao'] = $maximoAreaPreocupacao;
        return $dados;
    }

    public function getUsuarioPermissao()
    {

        $resources = UserHasResource::find()
            ->select('role')
            ->where([
                'user_id' => \Yii::$app->user->identity->id ?? null,
                'resource_id' => $this->id,
            ])
            ->column();

        $retorno = '';

        if (in_array(UserHasResource::NV_CP_CONTEXTO_ADM, $resources)) {
            $retorno .= '<span class="badge badge-lg badge-success">Advogado</span><br />';
        }
        if (in_array(UserHasResource::NV_CP_CONTEXTO_AUDITOR, $resources)) {
            $retorno .= '<span class="badge badge-lg badge-warning">Auditor</span><br />';
        }
        if (in_array(UserHasResource::NV_CP_CONTEXTO_ANALISE_TECNICA, $resources)) {
            $retorno .= '<span class="badge badge-lg badge-primary">Análise Técnica</span><br />';
        }
        if (in_array(UserHasResource::NV_CP_CONTEXTO_VIEW, $resources)) {
            $retorno .= '<span class="badge badge-lg badge-success">Visualizador</span><br />';
        }

        return $retorno;
    }

    public function getAplicacoesPossiveis($clienteId)
    {

        if (!$this->cliente_id) {
            $this->cliente_id = $clienteId;
        }

        $retorno = [];
        $aplicacoes = Aplicacao::find()
            ->select('aplicacao.id,aplicacao.nome')
            ->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' => $this->cliente_id,
                'aplicacao.status' => Aplicacao::ATIVO
            ])
            ->orderBy('aplicacao.nome ASC')
            ->all();

        foreach ($aplicacoes as $aplicacao) {

            $projetos = [];

            foreach ($aplicacao->aplicacaoTemProjetos as $aplicacaoTemProjeto) {

                $check = '';
                if ($this->id) {
                    $pattern = '/' . $this->id . ',/';
                    if (preg_match($pattern, $aplicacaoTemProjeto->projeto->contextos . ',')) {
                        $check = 'checked';
                    }
                }

                $projetos[] = [
                    'id' => $aplicacaoTemProjeto->projeto->id,
                    'nome' => $aplicacaoTemProjeto->projeto->nome,
                    'check' => $check,
                    'contextos' => $aplicacaoTemProjeto->projeto->contextos,
                ];
            }

            $retorno[] = [
                'aplicacao' => $aplicacao->nome,
                'projetos' => $projetos,
            ];
        }

        return $retorno;
    }

    public function getTasks()
    {

        return 0;
    }

    public static function retornaDesempenhoFeeling($modelId)
    {

        $model = self::findOne($modelId);

        if ($model->pontuacao >= self::PONTUACAO_NORMALIDADE_FEELING) {
            return '<div style="text-align:center; padding: 3px; background-color:#089F50">Excelência</div>';
        }
        if ($model->pontuacao <= self::PONTUACAO_CRITICA_FEELING) {
            return '<div style="text-align:center; padding: 3px; background-color:#DF5353">Comprometedor</div>';
        }

        return '<div style="text-align:center; padding: 3px; background-color:#E8DD11">Adequado</div>';
    }

    public static function dadosAvaliacaoDesempenho3($contexto, $aplicacao, $coleta, $minimoMercado = 0, $minimoExcelencia = 100, $origem = 'default')
    {

        //models são dados de coletas

        $dados = [];
        $datas = [];
        $nomes = [];
        $coletas = [];
        $ordens = [];
        $pontuacoes = [];
        $ordem = 0;
        $exibir = true;
        $minimo = 0;
        $maximo = 0;
        $evolucao = '0%';
        $indicadores = [];
        $totalIndicadores = 0;
        $dadosSparkLine = [];
        $minimoAreaPreocupacao = 0;
        $maximoAreaPreocupacao = 0;
        $dadosAbsolutoIndicadores = null;

        $verticalPeriodicidade = Vertical::PERIODO_UNICO;

        $ordens[$ordem] = $coleta->id;

        $datas[$coleta->id] = $coleta->data_coleta;

        $nomes[$coleta->id] = $coleta->nome;

        //$valorGlobal = self::valorGlobalAplicacao($contexto, $aplicacao, null, $coleta);
        $valorGlobal = $coleta->valorGlobal;

        $pontuacoes[$coleta->id] = $valorGlobal;

        $iconeValorGlobal = Cliente::valorGlobalIcone($contexto->cliente, $valorGlobal);

        $indicadoresColeta = ColetaIndicador::find()
            ->joinwith('verticalIndicador')
            ->joinWith('estrutura')
            ->where([
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
                'coleta_estrutura.coleta_id' => $coleta->id,
            ])
            ->orderBy('coleta_indicador.ordem_estruturada ASC')
            ->all();
        //Utils::debug($model);
        $totalIndicadores = count($indicadoresColeta);
        $grupoIndicadores = [];
        $grupoIndicadoresComprometedor = 0;
        $grupoIndicadoresMercado = 0;
        $grupoIndicadoresExcelencia = 0;
        $indicadoresComprometedor = [];
        $indicadoresMercado = [];
        $indicadoresExcelencia = [];
        $percentualIndicadoresComprometedor = 0;
        $percentualIndicadoresMercado = 0;
        $percentualIndicadoresExcelencia = 0;
        $m = 0;
        $percentualModelo = 0;

        $percentualModelo = ColetaIndicador::percentualDoModelo($coleta, $indicadoresColeta);

        $gppTemp = ArrayHelper::map(GppTemp::find()->all(), 'vertical_indicador_id', 'id');

        $indicadorSemInterpolacao = [];

        foreach ($indicadoresColeta as $indicadorColeta) {

            if ($indicadorColeta->vertical_indicador_id && $indicadorColeta->verticalIndicador->usa_interpolacao == false) {
                $indicadorSemInterpolacao[] = $indicadorColeta->verticalIndicador->id;
            }

            //if ($indicadorColeta->pontuacao) {
            $dadosSparkLine[$indicadorColeta->vertical_indicador_id][] = $indicadorColeta->pontuacao;
            //}


            if ($indicadorColeta->pontuacao <= $minimoMercado) {
                //if ($indicadorColeta->pontuacao < ColetaIndicador::PONTUACAO_MINIMA_MERCADO) {

                $indicadoresComprometedor[] = [
                    'id' => $indicadorColeta->id,
                    'nome' => $indicadorColeta->nome,
                    'evolucao' => 0,
                    'pontuacao' => $indicadorColeta->pontuacao,
                    'minimo' => $indicadorColeta->minimo,
                    'maximo' => $indicadorColeta->maximo,
                    'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                    'ordem' => $m,
                    'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                    'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                    'plano_acao' => isset($gppTemp[$indicadorColeta->vertical_indicador_id]),
                    'dados_absolutos' => $indicadorColeta->dadosAbsoluto,
                ];

                $grupoIndicadoresComprometedor++;
            } elseif ($indicadorColeta->pontuacao >= $minimoExcelencia) {

                $indicadoresExcelencia[] = [
                    'id' => $indicadorColeta->id,
                    'nome' => $indicadorColeta->nome,
                    'evolucao' => 0,
                    'pontuacao' => $indicadorColeta->pontuacao,
                    'minimo' => $indicadorColeta->minimo,
                    'maximo' => $indicadorColeta->maximo,
                    'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                    'ordem' => $m,
                    'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                    'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                    'plano_acao' => isset($gppTemp[$indicadorColeta->vertical_indicador_id]),
                    'dados_absolutos' => $indicadorColeta->dadosAbsoluto,
                ];

                $grupoIndicadoresExcelencia++;
            } else {

                $indicadoresMercado[] = [
                    'id' => $indicadorColeta->id,
                    'nome' => $indicadorColeta->nome,
                    'evolucao' => 0,
                    'pontuacao' => $indicadorColeta->pontuacao,
                    'minimo' => $indicadorColeta->minimo,
                    'maximo' => $indicadorColeta->maximo,
                    'taxa_substituicao' => $indicadorColeta->taxa_substituicao,
                    'ordem' => $m,
                    'percentualModelo' => isset($percentualModelo[$indicadorColeta->id]) ? str_replace(".", ",", $percentualModelo[$indicadorColeta->id]) : 'N/D',
                    'vertical_indicador_id' => $indicadorColeta->vertical_indicador_id,
                    'plano_acao' => isset($gppTemp[$indicadorColeta->vertical_indicador_id]),
                    'dados_absolutos' => $indicadorColeta->dadosAbsoluto,
                ];
                $grupoIndicadoresMercado++;
            }

            if (!isset($dadosAbsolutoIndicadores[$indicadorColeta->vertical_indicador_id])) {
                $dadosAbsolutoIndicadores[$indicadorColeta->vertical_indicador_id] = $indicadorColeta->getDadosAbsoluto();
            }
            $m++;
        }

        $percentualIndicadoresComprometedor = round((($grupoIndicadoresComprometedor / $totalIndicadores) * 100), 2);
        $indicadores['comprometedor'] = [
            'total' => $grupoIndicadoresComprometedor,
            'percentual' => str_replace(".", ",", $percentualIndicadoresComprometedor),
            'indicadores' => $indicadoresComprometedor,
        ];

        $percentualIndicadoresMercado = round((($grupoIndicadoresMercado / $totalIndicadores) * 100), 2);
        $indicadores['mercado'] = [
            'total' => $grupoIndicadoresMercado,
            'percentual' => str_replace(".", ",", $percentualIndicadoresMercado),
            'indicadores' => $indicadoresMercado,
        ];

        $percentualIndicadoresExcelencia = 100 - $percentualIndicadoresMercado - $percentualIndicadoresComprometedor;
        $indicadores['excelencia'] = [
            'total' => $grupoIndicadoresExcelencia,
            'percentual' => str_replace(".", ",", $percentualIndicadoresExcelencia),
            'indicadores' => $indicadoresExcelencia,
        ];

        $grupoIndicadores = [
            'comprometedor' => $grupoIndicadoresComprometedor,
            'mercado' => $grupoIndicadoresMercado,
            'excelencia' => $grupoIndicadoresExcelencia,
        ];

        $plots = [];

        $faixasPadrao = $coleta->faixasPadrao;

        foreach ($faixasPadrao as $k => $f) {

            list($r, $g, $b) = sscanf($f['color'], "#%02x%02x%02x");

            $plots[] = ['from' => $f['from'], 'to' => $f['to'], 'color' => 'rgba(' . $r . ',' . $g . ',' . $b . ', 0.15)', 'zIndex' => 0];

            if ($f['from'] < $minimo) {
                $minimo = $f['from'];
            }

            if ($f['to'] > $maximo) {
                $maximo = $f['to'];
            }
        }

        $dadosPerfilDesempenho = json_decode(json_encode($coleta->dadosPerfilDesempenho), true);
        if (!isset($dadosPerfilDesempenho['xy'])) {
            $dadosPerfilDesempenho = $coleta->dadosPerfilDesempenho;
        }


        if (isset($dadosPerfilDesempenho['xy'])) {
            $xy = $dadosPerfilDesempenho['xy'];
        } else {
            $xy = $coleta->dadosPerfilDesempenho['xy'];
        }

        if (isset($dadosPerfilDesempenho['y'])) {
            $y = $dadosPerfilDesempenho['y'];
        } else {
            $y = $coleta->dadosPerfilDesempenho['y'];
        }

        if (isset($dadosPerfilDesempenho['x'])) {
            $x = $dadosPerfilDesempenho['x'];
        } else {
            $x = $coleta->dadosPerfilDesempenho['x'];
        }

        $dadosDescritorEstruturaAlternativa = json_decode($coleta->dados_descritor_estrutura_alternativa, true);

        if (isset($dadosDescritorEstruturaAlternativa['dados'])) {
            $descritorEstruturaAlternativa = $dadosDescritorEstruturaAlternativa['dados'];
        } else {
            $descritorEstruturaAlternativa = $coleta->getDescritorEstruturaAlternativa($indicadoresColeta, $faixasPadrao);
        }

        $estruturas = Coleta::estrutura($coleta, false, $origem, $faixasPadrao);

        if ($coleta->dados_areas_preocupacao) {
            $areasPreocupacao = json_decode($coleta->dados_areas_preocupacao, true);
        } else {
            $areasPreocupacao = $coleta->getAreasPreocupacao($indicadoresColeta, $faixasPadrao);
        }

        foreach ($areasPreocupacao['dadospve'] as $n1) {
            foreach ($n1['data'] as $n2) {
                if ($n2['y'] < $minimoAreaPreocupacao) {
                    $minimoAreaPreocupacao = $n2['y'];
                }
                if ($n2['y'] > $maximoAreaPreocupacao) {
                    $maximoAreaPreocupacao = $n2['y'];
                }
            }
        }

        $coletas[$coleta->id] = [
            'id' => $coleta->id,
            'nome' => $coleta->nome,
            'pontuacao' => $valorGlobal,
            'iconeValorGlobal' => $iconeValorGlobal,
            'evolucao' => $evolucao,
            'data_coleta' => date('d/m/Y', strtotime($coleta->data_coleta)),
            'projeto_id' => $coleta->projeto_id,
            'cor' => $coleta->valorGlobalCor,
            'pvf' => $coleta->pvf,
            'areasPreocupacao' => $areasPreocupacao,
            'estruturas' => $estruturas,
            'indicadores' => $indicadores,
            'totalIndicadores' => $totalIndicadores,
            'grupoIndicadores' => $grupoIndicadores,
            'plots' => $plots,
            'data' => $xy,
            'datay' => $y,
            'datax' => $x,
            'descritorEstruturaAlternativa' => $descritorEstruturaAlternativa,
            'label' => $coleta->nome,
            'showLine' => $exibir,
            'indicadorSemInterpolacao' => $indicadorSemInterpolacao,
        ];
        if ($coleta->vertical_id) {
            if ($coleta->vertical->periodicidade == Vertical::PERIODO_DIARIO) {
                $verticalPeriodicidade = $coleta->vertical->periodicidade;
            }
        }

        $ordem++;
        $exibir = false;


        if ($minimoAreaPreocupacao > -50) {
            $minimoAreaPreocupacao = -50;
        }

        if ($maximoAreaPreocupacao < 150) {
            $maximoAreaPreocupacao = 150;
        }

        $dados['contexto'] = $contexto->id;
        $dados['total'] = 1;
        $dados['ordem'] = $ordens;
        $dados['nomes'] = $nomes;
        $dados['pontuacoes'] = $pontuacoes;
        $dados['datas'] = $datas;
        $dados['dadosSparkLine'] = $dadosSparkLine;
        $dados['coletas'] = $coleta;
        $dados['minimo'] = $minimo;
        $dados['maximo'] = $maximo;
        $dados['minimoAreaPreocupacao'] = $minimoAreaPreocupacao;
        $dados['maximoAreaPreocupacao'] = $maximoAreaPreocupacao;
        $dados['verticalPeriodicidade'] = $verticalPeriodicidade;
        $dados['dadosAbsolutoIndicadores'] = $dadosAbsolutoIndicadores;

        return $dados;
    }

    public function getAdvogadoNome()
    {

        if ($this->id == self::ID_VIA_LGPD) {
            return '...';
        }

        $users = \app\models\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' => $this->id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->groupBy('user_ceon.id')
            ->all();

        if (!$users) {
            return ' - ';
        }

        $retorno = '<ul>';
        foreach ($users as $user) {
            $retorno .= '<li>' . $user->name . '</li>';
        }
        $retorno .= '</ul>';

        return $retorno;
    }

    public function getLgpdFaseText()
    {

        $inventarioRespostas = \app\models\InventarioResposta::find()
            ->joinWith(['scope', 'inventarioScope'])
            ->where([
                'inventario_resposta.inventario_pergunta_id' => \app\models\InventarioPergunta::PERGUNTA_ID_FASE,
                'inventario_resposta.aplica' => \app\models\InventarioResposta::APLICA_SIM,
                'scope.contexto_id' => $this->id,
                'scope.status' => Scope::ATIVO,
                'inventario_scope.status' => \app\models\InventarioScope::ATIVO,
            ])
            ->andWhere(['!=', 'inventario_resposta.status', \app\models\InventarioResposta::INATIVO])
            ->all();

        $resposta = null;
        foreach ($inventarioRespostas as $inventarioResposta) {
            $resposta = $inventarioResposta->alternativas_radiobox;
        }
        if ($resposta) {
            return $resposta;
        }


        return '--';
        //        $ultimaColeta = Coleta::find()
        //                ->where([
        //                    'contexto_id' => $this->id,
        //                    'status' => Coleta::ATIVO
        //                ])
        //                ->orderBy('id desc')
        //                ->one();
        //
        //        if (!$ultimaColeta) {
        //            return 'Sem coleta';
        //        }
        //
        //        $faseConformidade = \app\modules\performance\models\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')
        //                ->join('LEFT JOIN', 'coleta', 'coleta.id = coleta_estrutura.coleta_id')
        //                ->join('LEFT JOIN', 'contexto', 'contexto.id = coleta.contexto_id')                
        //                ->where([
        //                    'coleta.id' => $ultimaColeta->id,
        //                    'coleta_alternativa.selecionado' => \app\modules\performance\models\ColetaAlternativa::SELECIONADO,
        //                ])
        //                ->andWhere(['OR',
        //                    ['=', 'coleta_indicador.vertical_indicador_id', VerticalIndicador::LGPD_INDICADOR_FASE],
        //                    ['=', 'coleta_indicador.vertical_indicador_id', VerticalIndicador::LGPD_INDICADOR_FASE_MODELO_420],
        //                    ['=', 'coleta_indicador.vertical_indicador_id', VerticalIndicador::LGPD_INDICADOR_FASE_MODELO_420_OUTRO],
        //                ])
        //                ->one();
        //
        //        if ($faseConformidade) {
        //            return $faseConformidade->nome;
        //        }
        //
        //        return '-';
    }

    public function getLgpdRisco()
    {

        $riscoCenario = \app\modules\performance\models\RiscoCenario::find()
            ->select([
                'risco_modelo.id as modeloid',
                'risco_modelo.nome as modelo',
                'cliente.nome as cliente',
                'contexto.id as contextoid',
                'contexto.name as contexto',
                'vertical.nome as vertical',
                'risco_cenario.id',
                'risco_cenario.pontuacao as pontuacao',
            ])
            ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
            ->leftJoin('risco_modelo', 'risco_cenario.risco_modelo_id = risco_modelo.id')
            ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
            ->leftJoin('vertical', 'coleta.vertical_id = vertical.id')
            ->leftJoin('cliente', 'contexto.cliente_id = cliente.id')
            ->where([
                'contexto.id' => $this->id,
                'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
            ])
            ->orderBy('cliente.nome ASC, contexto.name ASC, risco_cenario.id DESC')
            ->asArray()
            ->one();

        if (!$riscoCenario) {
            return '-';
        }

        $faixas = [];

        $riscoCenarioFaixas = RiscoCenarioFaixa::find()
            ->where([
                'risco_cenario_id' => $riscoCenario['id'],
                'status' => RiscoCenarioFaixa::ATIVO
            ])
            ->all();


        if ($riscoCenarioFaixas) {

            foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {

                $faixas[] = [
                    'faixa' => $riscoCenarioFaixa->faixa,
                    'de' => $riscoCenarioFaixa->de,
                    'ate' => $riscoCenarioFaixa->ate,
                    'cor' => $riscoCenarioFaixa->cor,
                ];
            }
        } else {

            $riscoModeloFaixas = RiscoModeloFaixa::find()
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'status' => RiscoModeloFaixa::ATIVO
                ])
                ->all();

            if ($riscoModeloFaixas) {

                foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
                    $faixas[] = [
                        'faixa' => $riscoModeloFaixa->faixa,
                        'de' => $riscoModeloFaixa->de,
                        'ate' => $riscoModeloFaixa->ate,
                        'cor' => $riscoModeloFaixa->cor,
                    ];
                }
            } else {
                $faixas = RiscoModeloFaixa::FAIXA_BASE;
            }
        }


        foreach ($faixas as $faixa) {
            if ($riscoCenario['pontuacao'] >= $faixa['de'] && $riscoCenario['pontuacao'] <= $faixa['ate']) {
                return '<span class="badge-contexto" style=" background-color: ' . $faixa["cor"] . '; color: white;">' . ucfirst($faixa["faixa"]) . '</span>';
            }
        }

        /*
        if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
            return '<span class="badge-contexto risco-baixo">Baixo</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
            return '<span class="badge-contexto risco-moderado">Moderado</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
            return '<span class="badge-contexto risco-alto">Alto</span>';
        } else {
            return '<span class="badge-contexto risco-critico">Crítico</span>';
        }

        return '-';
        */
    }

    public function getLgpdRiscoView()
    {

        $riscoCenario = \app\modules\performance\models\RiscoCenario::find()
            ->select([
                'risco_modelo.id as modeloid',
                'risco_modelo.nome as modelo',
                'cliente.nome as cliente',
                'contexto.id as contextoid',
                'contexto.name as contexto',
                'vertical.nome as vertical',
                'risco_cenario.id',
                'risco_cenario.pontuacao as pontuacao',
            ])
            ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
            ->leftJoin('risco_modelo', 'risco_cenario.risco_modelo_id = risco_modelo.id')
            ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
            ->leftJoin('vertical', 'coleta.vertical_id = vertical.id')
            ->leftJoin('cliente', 'contexto.cliente_id = cliente.id')
            ->where([
                'contexto.id' => $this->id,
                'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
            ])
            ->orderBy('cliente.nome ASC, contexto.name ASC, risco_cenario.id DESC')
            ->asArray()
            ->one();

        if (!$riscoCenario) {
            return '-';
        }

        $faixas = [];

        $riscoCenarioFaixas = RiscoCenarioFaixa::find()
            ->where([
                'risco_cenario_id' => $riscoCenario['id'],
                'status' => RiscoCenarioFaixa::ATIVO
            ])
            ->all();


        if ($riscoCenarioFaixas) {

            foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {

                $faixas[] = [
                    'faixa' => $riscoCenarioFaixa->faixa,
                    'de' => $riscoCenarioFaixa->de,
                    'ate' => $riscoCenarioFaixa->ate,
                    'cor' => $riscoCenarioFaixa->cor,
                ];
            }
        } else {

            $riscoModeloFaixas = RiscoModeloFaixa::find()
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'status' => RiscoModeloFaixa::ATIVO
                ])
                ->all();

            if ($riscoModeloFaixas) {

                foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
                    $faixas[] = [
                        'faixa' => $riscoModeloFaixa->faixa,
                        'de' => $riscoModeloFaixa->de,
                        'ate' => $riscoModeloFaixa->ate,
                        'cor' => $riscoModeloFaixa->cor,
                    ];
                }
            } else {
                $faixas = RiscoModeloFaixa::FAIXA_BASE;
            }
        }

        //Utils::debug($riscoCenario['pontuacao']);
        foreach ($faixas as $faixa) {
            if ($riscoCenario['pontuacao'] >= $faixa['de'] && $riscoCenario['pontuacao'] <= $faixa['ate']) {
                return '<span class="badge badge-lg" style=" background-color: ' . $faixa["cor"] . '; color: white;font-size: 13px;">Risco ' . $faixa["faixa"] . '</span>';
            }
        }

        /*
        if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
            return '<span class="badge badge-lg risco-baixo" style="color: white;font-size: 13px;">Risco Baixo</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
            return '<span class="badge badge-lg risco-moderado" style="color: white;font-size: 13px;">Risco Moderado</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
            return '<span class="badge badge-lg risco-alto" style="color: white;font-size: 13px;">Risco Alto</span>';
        } else {
            return '<span class="badge badge-lg risco-critico" style="color: white;font-size: 13px;">Risco Crítico</span>';
        }
            */

        return '-';
    }

    public function getLgpdRiscoSoTexto()
    {

        $riscoCenario = \app\modules\performance\models\RiscoCenario::find()
            ->select([
                'risco_modelo.id as modeloid',
                'risco_modelo.nome as modelo',
                'cliente.nome as cliente',
                'contexto.id as contextoid',
                'contexto.name as contexto',
                'vertical.nome as vertical',
                'risco_cenario.id',
                'risco_cenario.pontuacao as pontuacao',
            ])
            ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
            ->leftJoin('risco_modelo', 'risco_cenario.risco_modelo_id = risco_modelo.id')
            ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
            ->leftJoin('vertical', 'coleta.vertical_id = vertical.id')
            ->leftJoin('cliente', 'contexto.cliente_id = cliente.id')
            ->where([
                'contexto.id' => $this->id,
                'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
            ])
            ->orderBy('cliente.nome ASC, contexto.name ASC, risco_cenario.id DESC')
            ->asArray()
            ->one();

        if (!$riscoCenario) {
            return '-';
        }

        $faixas = [];

        $riscoCenarioFaixas = RiscoCenarioFaixa::find()
            ->where([
                'risco_cenario_id' => $riscoCenario['id'],
                'status' => RiscoCenarioFaixa::ATIVO
            ])
            ->all();


        if ($riscoCenarioFaixas) {

            foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {

                $faixas[] = [
                    'faixa' => $riscoCenarioFaixa->faixa,
                    'de' => $riscoCenarioFaixa->de,
                    'ate' => $riscoCenarioFaixa->ate,
                    'cor' => $riscoCenarioFaixa->cor,
                ];
            }
        } else {

            $riscoModeloFaixas = RiscoModeloFaixa::find()
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'status' => RiscoModeloFaixa::ATIVO
                ])
                ->all();

            if ($riscoModeloFaixas) {

                foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
                    $faixas[] = [
                        'faixa' => $riscoModeloFaixa->faixa,
                        'de' => $riscoModeloFaixa->de,
                        'ate' => $riscoModeloFaixa->ate,
                        'cor' => $riscoModeloFaixa->cor,
                    ];
                }
            } else {
                $faixas = RiscoModeloFaixa::FAIXA_BASE;
            }
        }


        foreach ($faixas as $faixa) {
            if ($riscoCenario['pontuacao'] >= $faixa['de'] && $riscoCenario['pontuacao'] <= $faixa['ate']) {
                return ucfirst($faixa["faixa"]);
            }
        }

        /*
        if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
            return '<span class="badge-contexto risco-baixo">Baixo</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
            return '<span class="badge-contexto risco-moderado">Moderado</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
            return '<span class="badge-contexto risco-alto">Alto</span>';
        } else {
            return '<span class="badge-contexto risco-critico">Crítico</span>';
        }

        return '-';
        */
    }

    public function getLgpdRiscoSoValor()
    {

        $riscoCenario = \app\modules\performance\models\RiscoCenario::find()
            ->select([
                'risco_modelo.id as modeloid',
                'risco_modelo.nome as modelo',
                'cliente.nome as cliente',
                'contexto.id as contextoid',
                'contexto.name as contexto',
                'vertical.nome as vertical',
                'risco_cenario.id',
                'risco_cenario.pontuacao as pontuacao',
            ])
            ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
            ->leftJoin('risco_modelo', 'risco_cenario.risco_modelo_id = risco_modelo.id')
            ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
            ->leftJoin('vertical', 'coleta.vertical_id = vertical.id')
            ->leftJoin('cliente', 'contexto.cliente_id = cliente.id')
            ->where([
                'contexto.id' => $this->id,
                'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
            ])
            ->orderBy('cliente.nome ASC, contexto.name ASC, risco_cenario.id DESC')
            ->asArray()
            ->one();

        if (!$riscoCenario) {
            return '-';
        }

        $faixas = [];

        $riscoCenarioFaixas = RiscoCenarioFaixa::find()
            ->where([
                'risco_cenario_id' => $riscoCenario['id'],
                'status' => RiscoCenarioFaixa::ATIVO
            ])
            ->all();


        if ($riscoCenarioFaixas) {

            foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {

                $faixas[] = [
                    'faixa' => $riscoCenarioFaixa->faixa,
                    'de' => $riscoCenarioFaixa->de,
                    'ate' => $riscoCenarioFaixa->ate,
                    'cor' => $riscoCenarioFaixa->cor,
                ];
            }
        } else {

            $riscoModeloFaixas = RiscoModeloFaixa::find()
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'status' => RiscoModeloFaixa::ATIVO
                ])
                ->all();

            if ($riscoModeloFaixas) {

                foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
                    $faixas[] = [
                        'faixa' => $riscoModeloFaixa->faixa,
                        'de' => $riscoModeloFaixa->de,
                        'ate' => $riscoModeloFaixa->ate,
                        'cor' => $riscoModeloFaixa->cor,
                    ];
                }
            } else {
                $faixas = RiscoModeloFaixa::FAIXA_BASE;
            }
        }


        foreach ($faixas as $faixa) {
            if ($riscoCenario['pontuacao'] >= $faixa['de'] && $riscoCenario['pontuacao'] <= $faixa['ate']) {
                return $riscoCenario['pontuacao'];
            }
        }

        /*
        if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
            return '<span class="badge-contexto risco-baixo">Baixo</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
            return '<span class="badge-contexto risco-moderado">Moderado</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
            return '<span class="badge-contexto risco-alto">Alto</span>';
        } else {
            return '<span class="badge-contexto risco-critico">Crítico</span>';
        }

        return '-';
        */
    }

    public function getLgpdPontuacao()
    {

        $pontuacao = $this->valorGlobal;
        $cor = '';
        $corFonte = '';

        if ((float) $pontuacao >= 81) {
            $cor = '--green-500';
            $corFonte = '--white';
        } elseif ((float) $pontuacao >= 51) {
            $cor = '--yellow-500';
            $corFonte = '--gray-800';
        } else {
            $cor = '--red-500';
            $corFonte = '--white';
        }

        // if ($pontuacao >= 80) {
        //     $cor = self::LGPD_CORES[100];
        // } elseif ($pontuacao > 70) {
        //     $cor = self::LGPD_CORES[80];
        // } elseif ($pontuacao > 30) {
        //     $cor = self::LGPD_CORES[70];
        // } elseif ($pontuacao > 20) {
        //     $cor = self::LGPD_CORES[30];
        // } elseif ($pontuacao > 0) {
        //     $cor = self::LGPD_CORES[20];
        // } else {
        //     $cor = '#FFFFFF';
        // }



        return '<div class="badge-contexto" style="width: 65px !important; background-color: var(' . $cor . '); color: var(' . $corFonte . ')">' . ((int)$this->valorGlobal) . '</div>';
    }

    public static function organograma($contexto, $destino = 'contexto')
    {

        $dados = [];
        $select = [];
        $paiFilho = [];

        $scopes = Scope::find()
            ->andWhere(['contexto_id' => $contexto->id])
            ->andWhere(['=', 'status', Scope::STATUS_ACTIVE])
            ->all();

        if (!$scopes) {

            $root = Scope::find()->where(['cliente_id' => $contexto->cliente_id])->orderBy('id DESC')->one();

            if (!$root) {

                $ultimo = Scope::find()->orderBy('id DESC')->one();

                $root = new Scope();
                $root->type = Scope::TYPE_CLIENT;
                $root->name = $contexto->cliente->nome;
                $root->parent_id = null;
                $root->root = $ultimo->id + 1;
                $root->status = Scope::STATUS_ACTIVE;
                $root->cliente_id = $contexto->cliente_id;
                $root->geral_especifico = Scope::ESPECIFICO;
                $root->responde_inventario = Scope::RESPONDE_INVENTARIO_SIM;

                if (!$root->save()) {
                    throw new Exception("Erro ao criar organograma base, motivo: " . json_encode($root->getErrors()), 1);
                }
            }

            $raiz = new Scope();
            $raiz->type = Scope::TYPE_GERENCIA;
            $raiz->name = $contexto->name;
            $raiz->parent_id = null;
            $raiz->root = $root->id + 1;
            $raiz->status = Scope::STATUS_ACTIVE;
            $raiz->cliente_id = $contexto->cliente_id;
            $raiz->contexto_id = $contexto->id;
            $raiz->geral_especifico = Scope::ESPECIFICO;
            $raiz->responde_inventario = Scope::RESPONDE_INVENTARIO_SIM;

            if (!$raiz->save()) {
                throw new Exception("Erro ao criar organograma base, motivo: " . json_encode($raiz->getErrors()), 1);
            }

            $scopes = Scope::find()
                ->andWhere(['contexto_id' => $contexto->id])
                ->andWhere(['=', 'status', Scope::STATUS_ACTIVE])
                ->all();
        }


        //        $inventarios = ArrayHelper::map(\app\models\InventarioResposta::find()
        //                                ->groupBy('scope_id')
        //                                ->all(), 'scope_id', 'status');
        //Utils::debug($inventarios);
        foreach ($scopes as $scope) {

            //            if (!isset($inventarios[$scope->id])) {
            //                $temInventario = InventarioResposta::LISTA_STATUS_LEGENDA[InventarioResposta::NAO_RESPONDIDO];
            //            } else {
            //
            //                if (isset($inventarios[$scope->id])) {
            //                    if (isset(InventarioResposta::LISTA_STATUS_LEGENDA[$inventarios[$scope->id]])) {
            //                        $temInventario = InventarioResposta::LISTA_STATUS_LEGENDA[$inventarios[$scope->id]];
            //                    } else {
            //                        $temInventario = InventarioResposta::LISTA_STATUS_LEGENDA[InventarioResposta::RECUSADO];
            //                    }
            //                } else {
            //                    $temInventario = InventarioResposta::LISTA_STATUS_LEGENDA[InventarioResposta::PENDENCIA];
            //                }
            //            }

            $temInventario = $scope->inventarioStatus;

            $br = '';
            $ex = explode(" ", $scope->name);
            if (count($ex) == 1) {
                $br = '<br />';
            }
            if ($destino == 'contexto') {
                $dados[] = [['v' => "$scope->id", 'f' => '<div class="organograma-data-container"><span class="organograma-title">' . $scope->name . ' </span> ' . $br . ' ' . $temInventario . '</div>'], "$scope->parent_id", '',];
            } else {
                $dados[] = [['v' => "$scope->id", 'f' => $scope->name], "$scope->parent_id", '',];
            }

            $select[$scope->id] = $scope->name;

            $paiFilho[$scope->id] = [
                'parent_id' => $scope->parent_id,
                'respondido_por' => (string) $scope->respondido_por,
                'respondido_email' => (string) $scope->respondido_email,
                'geral_especifico' => (int) $scope->geral_especifico,
                'responde_inventario' => (int) $scope->responde_inventario,
            ];
        }
        //  Utils::debug([$scopes, $dados]);
        return [
            'dados' => $dados,
            'select' => $select,
            'paiFilho' => $paiFilho,
        ];
    }

    public function getTipoLicenca()
    {

        $licenca = \app\models\Licenca::find()
            ->where([
                'contexto_id' => $this->id,
            ])
            ->one();

        if (!$licenca) {
            return 'Aguardando liberação';
        }

        if ($licenca->status == \app\models\Licenca::LIBERADO) {
            return 'Licenciado';
        } else {
            return 'Aguardando liberação';
        }
    }

    public function getPagseguroLinkContexto()
    {

        return false;
        $licenca = \app\models\Licenca::find()
            ->where([
                'contexto_id' => $this->id,
                'status' => \app\models\Licenca::AGUARDANDO_PAGAMENTO,
            ])
            ->one();

        if ($licenca) {
            return $licenca->link_pagamento;
        }

        return '';
    }

    public function getNumeroLicenca()
    {

        $licenca = \app\models\Licenca::find()
            ->where([
                'contexto_id' => $this->id,
                'status' => \app\models\Licenca::LIBERADO
            ])
            ->one();

        if ($licenca) {
            return $licenca->referencia;
        }

        return '';
    }

    public function getValorLicenca()
    {

        $licenca = \app\models\Licenca::find()
            ->where([
                'contexto_id' => $this->id,
                'status' => \app\models\Licenca::LIBERADO
            ])
            ->one();

        if ($licenca) {
            return \Yii::$app->formatter->asCurrency($licenca->valor);
        }

        return \Yii::$app->formatter->asCurrency(floatval(\app\models\Licenca::VALOR_PADRAO));
    }

    public function getFaseContexto()
    {

        $ultimaColeta = Coleta::find()
            ->where([
                'contexto_id' => $this->id,
                'status' => Coleta::ATIVO,
            ])
            ->orderBy('id DESC')
            ->one();

        if (!$ultimaColeta) {
            return '-';
        }

        $alternativaFaseDeConformidade = 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_alternativa.selecionado' => ColetaAlternativa::SELECIONADO,
                'coleta_alternativa.status' => ColetaAlternativa::ATIVO,
                'coleta_indicador.nome' => 'Fase de conformidade',
                'coleta_indicador.status' => ColetaIndicador::ATIVO,
                'coleta_estrutura.coleta_id' => $ultimaColeta->id,
                'coleta_estrutura.status' => ColetaEstrutura::ATIVO,
            ])
            ->one();

        if (!$alternativaFaseDeConformidade) {
            return '-';
        }

        return $alternativaFaseDeConformidade->nome;
    }

    public function getAcessoTemporarioLiberado()
    {

        if ($this->id == self::ID_VIA_LGPD) {
            return true;
        }

        if (\app\components\Logged::isCeonFinanceiro()) {

            $acessoTemporarioContexto = \app\models\AcessoTemporarioContexto::find()
                ->where([
                    'contexto_id' => $this->id,
                    'user_id' => Yii::$app->user->identity->id,
                ])
                ->andWhere(['<=', 'data_inicio', date('Y-m-d')])
                ->andWhere(['>=', 'data_fim', date('Y-m-d')])
                ->one();

            if (!$acessoTemporarioContexto) {
                return false;
            }
        }

        return true;
    }

    public static function copiaDegustacao($projeto)
    {

        $valid = true;
        $msgErro = '';

        $transaction = Yii::$app->db->beginTransaction();

        try {

            $contexto = new self;
            $contexto->natureza = 'GPSLGPD';
            $contexto->name = 'Demo';
            $contexto->cliente_id = $projeto->cliente_id;
            $contexto->active = Contexto::ATIVO;
            $contexto->created_at = date('Y-m-d H:i:s');
            $contexto->cadastrado_por = \app\models\User::USER_EXTERNAL;
            $contexto->cota_disco = Contexto::COTA_PADRAO;

            if (!$contexto->makeRoot()) {
                $valid = false;
                $msgErro .= '1 - Erro ao criar o contexto';
            }

            if ($valid) {
                $projeto->contextos = $projeto->contextos . ',' . $contexto->id;
                if (!$projeto->save()) {
                    $valid = false;
                    $msgErro .= '2 - Erro ao salvar o Projeto, motivo: ' . json_encode($projeto->getErrors());
                }
            }

            if ($valid) {

                $licenca = new \app\models\Licenca();
                $licenca->criado_por = \app\models\User::USER_EXTERNAL;
                $licenca->criado_em = date('Y-m-d H:i:s');
                $licenca->status = \app\models\Licenca::LIBERADO;
                $licenca->forma_pagamento = \app\models\Licenca::FORMA_PARCERIA_GPSLGPD_DEGUSTACAO;
                $licenca->cliente_id = $projeto->cliente_id;
                $licenca->contexto_id = $contexto->id;
                $licenca->valor = 0;
                $licenca->referencia = $projeto->cliente_id . '-' . time();

                if (!$licenca->save()) {
                    $valid = false;
                    $msgErro .= '3 - Erro ao salvar a Licença, motivo: ' . json_encode($licenca->getErrors());
                }
            }

            if ($valid) {
                $coleta = Coleta::find()
                    ->where([
                        'contexto_id' => Contexto::ID_VIA_LGPD,
                        'status' => Coleta::ATIVO,
                    ])
                    ->one();

                if (!$coleta) {
                    $valid = false;
                    $msgErro .= '4 - Erro: coleta base não encontrada';
                }
            }

            if ($valid) {
                $copia = new Coleta();
                $copia->nome = $coleta->nome;
                $copia->projeto_id = $projeto->id;
                $copia->contexto_id = $contexto->id;
                $copia->vertical_id = $coleta->vertical_id;
                $copia->data_coleta = date('Y-m-d H:i:s');
                $copia->status = Coleta::ATIVO;
                $copia->created_by = \app\models\User::USER_EXTERNAL;

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

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

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

            //            if ($valid) {
            //                //scopes
            //                $scopesLista = [];
            //                $scopesLista[] = 'Ger. Adm / Fin';
            //                $scopesLista[] = 'Ger. Com';
            //                $scopesLista[] = 'Ger. Ope';
            //                $scopesLista[] = 'Ger. Tec';
            //                $scopesLista[] = 'Ger. Jur';
            //
            //                $scopePai = Scope::find()
            //                        ->where([
            //                            'cliente_id' => $contexto->cliente_id,
            //                            'contexto_id' => $contexto->id,                          
            //                            'status' => Scope::ATIVO,
            //                        ])
            //                        ->one();
            //
            //                if (!$scopePai) {
            //                   
            //                    $valid = false;
            //                    $msgErro .= '6 - Escopo raiz não encontrado';
            //                }
            //            }
            //
            //            if ($valid) {
            //                foreach ($scopesLista as $scopeLista) {
            //                    if ($valid) {
            //                        $scope = new Scope();
            //                        $scope->type = 'Gerência';
            //                        $scope->name = $scopeLista;
            //                        $scope->parent_id = $scopePai->id;
            //                        $scope->root = $scopePai->id;
            //                        $scope->status = Scope::ATIVO;
            //                        $scope->cliente_id = $contexto->cliente_id;
            //                        $scope->contexto_id = $contexto->id;
            //
            //                        if (!$scope->save()) {
            //                            $valid = false;
            //                            $msgErro .= "7 - Erro ao salvar o escopo, motivo: " . json_encode($scope->getErrors());
            //                        }
            //                    }
            //                }
            //            }
            //inventariodados

            if ($valid) {
                $demoAnaliseRegulatorias = \app\models\ContextoTemAnaliseRegulatoria::find()
                    ->where([
                        'contexto_id' => Contexto::ID_VIA_LGPD,
                    ])
                    ->all();

                foreach ($demoAnaliseRegulatorias as $demoAnaliseRegulatoria) {
                    if ($valid) {
                        $contextoAnaliseRegulatoria = new \app\models\ContextoTemAnaliseRegulatoria();
                        $contextoAnaliseRegulatoria->contexto_id = $contexto->id;
                        $contextoAnaliseRegulatoria->analise_regulatoria_id = $demoAnaliseRegulatoria->analise_regulatoria_id;
                        $contextoAnaliseRegulatoria->observacao = $demoAnaliseRegulatoria->observacao;

                        if (!$contextoAnaliseRegulatoria->save()) {
                            $valid = false;
                            $msgErro .= '6 - Erro ao salvar a análise regulatória';
                        }
                    }
                }
            }

            if ($valid) {
                $transaction->commit();
                return true;
            } else {
                $transaction->rollBack();
                return $msgErro;
            }
        } catch (Exception $exception) {
            $transaction->rollBack();
            return $msgErro;
        }
    }

    public function getAdvogadoNomeSimples()
    {

        if ($this->id == self::ID_VIA_LGPD) {
            return '...';
        }

        $users = \app\models\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' => $this->id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->groupBy('user_ceon.id')
            ->all();

        if (!$users) {
            return ' - ';
        }

        $retorno = '';
        foreach ($users as $user) {
            $retorno .= ' ' . $user->name . '<w:br/>';
        }
        $retorno .= '';

        return $retorno;
    }

    public function getLgpdRiscoText()
    {

        $riscoCenario = \app\modules\performance\models\RiscoCenario::find()
            ->select([
                'risco_modelo.id as modeloid',
                'risco_modelo.nome as modelo',
                'cliente.nome as cliente',
                'contexto.id as contextoid',
                'contexto.name as contexto',
                'vertical.nome as vertical',
                'risco_cenario.id',
                'risco_cenario.pontuacao as pontuacao',
            ])
            ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
            ->leftJoin('risco_modelo', 'risco_cenario.risco_modelo_id = risco_modelo.id')
            ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
            ->leftJoin('vertical', 'coleta.vertical_id = vertical.id')
            ->leftJoin('cliente', 'contexto.cliente_id = cliente.id')
            ->where([
                'contexto.id' => $this->id,
                'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
            ])
            ->orderBy('cliente.nome ASC, contexto.name ASC, risco_cenario.id DESC')
            ->asArray()
            ->one();

        if (!$riscoCenario) {
            return '-';
        }

        $faixas = [];

        $riscoCenarioFaixas = RiscoCenarioFaixa::find()
            ->where([
                'risco_cenario_id' => $riscoCenario['id'],
                'status' => RiscoCenarioFaixa::ATIVO
            ])
            ->all();


        if ($riscoCenarioFaixas) {

            foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {

                $faixas[] = [
                    'faixa' => $riscoCenarioFaixa->faixa,
                    'de' => $riscoCenarioFaixa->de,
                    'ate' => $riscoCenarioFaixa->ate,
                    'cor' => $riscoCenarioFaixa->cor,
                ];
            }
        } else {

            $riscoModeloFaixas = RiscoModeloFaixa::find()
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'status' => RiscoModeloFaixa::ATIVO
                ])
                ->all();

            if ($riscoModeloFaixas) {

                foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
                    $faixas[] = [
                        'faixa' => $riscoModeloFaixa->faixa,
                        'de' => $riscoModeloFaixa->de,
                        'ate' => $riscoModeloFaixa->ate,
                        'cor' => $riscoModeloFaixa->cor,
                    ];
                }
            } else {
                $faixas = RiscoModeloFaixa::FAIXA_BASE;
            }
        }

        foreach ($faixas as $faixa) {
            if ($riscoCenario['pontuacao'] >= $faixa['de'] && $riscoCenario['pontuacao'] <= $faixa['ate']) {
                return $faixa["faixa"];
            }
        }

        /*
        if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
            return 'Baixo';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
            return 'Moderado';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
            return 'Alto';
        } else {
            return 'Crítico';
        }
            */

        return '-';
    }

    public function getAdvogadoNomeArrayGestor()
    {
         return [];
    }
    

    public function getAdvogadoNomeArray()
    {

        if ($this->id == self::ID_VIA_LGPD) {
            return [];
        }

        $users = \app\models\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' => $this->id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->groupBy('user_ceon.id')
            ->all();

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

        $retorno = [];
        foreach ($users as $user) {
            $retorno[] = $user->name;
        }

        return $retorno;
    }

    public function getAdvogadoEmailSimples()
    {

        if ($this->id == self::ID_VIA_LGPD) {
            return '...';
        }

        $users = \app\models\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' => $this->id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
            ])
            ->groupBy('user_ceon.id')
            ->all();

        if (!$users) {
            return ' - ';
        }

        $retorno = '';
        foreach ($users as $user) {
            $retorno .= ' ' . $user->email . '<w:br/>';
        }
        $retorno .= '';

        return $retorno;
    }

    public function getNameDecode()
    {
        return Html::decode($this->name ?? '');
    }

    public function getLgpdRelevanciaText()
    {

        $inventarioScopeRelevancia = InventarioScope::find()
            ->joinWith('scope')
            ->where([
                'scope.contexto_id' => $this->id,
                'inventario_dados_id' => InventarioDados::RELEVANCIA_ID,
                'inventario_scope.status' => InventarioScope::ATIVO,
                'scope.status' => Scope::ATIVO,
            ])
            ->one();

        if (!$inventarioScopeRelevancia) {
            return '';
        }

        return $inventarioScopeRelevancia->getRiscoCor('relevancia');
        /*
        $inventarioRespostas = \app\models\InventarioResposta::find()
            ->joinWith(['scope', 'inventarioScope'])
            ->where([
                'inventario_resposta.inventario_pergunta_id' => \app\models\InventarioPergunta::PERGUNTA_ID_RELEVANCIA,
                'inventario_resposta.aplica' => \app\models\InventarioResposta::APLICA_SIM,
                'scope.contexto_id' => $this->id,
                'scope.status' => Scope::ATIVO,
                'inventario_scope.status' => \app\models\InventarioScope::ATIVO,
            ])
            ->andWhere(['!=', 'inventario_resposta.status', \app\models\InventarioResposta::INATIVO])
            ->all();

        $resposta = null;
        foreach ($inventarioRespostas as $inventarioResposta) {
            $respostaOriginal = $inventarioResposta->alternativas_radiobox;

            if ($respostaOriginal) {
                if (isset(InventarioPergunta::RELEVANCIA_DEPARA[$respostaOriginal])) {
                    $resposta = InventarioPergunta::RELEVANCIA_DEPARA[$respostaOriginal];
                }
            }
        }
        if ($resposta) {
            return $resposta;
        }

        */

        return '--';
    }

    public function getLgpdSTatusQuoText()
    {

        $inventarioRespostas = \app\models\InventarioResposta::find()
            ->joinWith(['scope', 'inventarioScope'])
            ->where([
                'inventario_resposta.inventario_pergunta_id' => \app\models\InventarioPergunta::PERGUNTA_ID_STATUS_QUO,
                'inventario_resposta.aplica' => \app\models\InventarioResposta::APLICA_SIM,
                'scope.contexto_id' => $this->id,
                'scope.status' => Scope::ATIVO,
                'inventario_scope.status' => \app\models\InventarioScope::ATIVO,
            ])
            ->andWhere(['!=', 'inventario_resposta.status', \app\models\InventarioResposta::INATIVO])
            ->all();

        $resposta = null;
        foreach ($inventarioRespostas as $inventarioResposta) {
            $resposta = $inventarioResposta->alternativas_radiobox;
        }
        if ($resposta) {
            return $resposta;
        }


        return '--';
    }

    public function riscosgravescinquenta($coleta)
    {

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

        if (!$riscoCenario) {
            return '<i> nenhum risco relevante</i>';
        }

        $riscos = Risco::find()
            ->where([
                'risco_cenario_id' => $riscoCenario->id,
                'status' => Risco::ATIVO,
            ])
            ->all();

        $t = 0;

        $retorno = '<ul>';
        foreach ($riscos as $risco) {

            $riscoConsequencia = RiscoConsequencia::find()
                ->where([
                    'risco_id' => $risco->id,
                    'status' => RiscoConsequencia::SELECIONADO,
                ])
                ->andWhere(
                    [
                        'OR',
                        ['=', 'descritor', 'Grave'],
                        ['=', 'descritor', 'Severo'],
                        ['=', 'descritor', 'Catastrófico'],
                    ]
                )
                ->one();

            if ($riscoConsequencia) {

                if ($risco->probabilidadeValor >= 50) {

                    $retorno .= '<li>' . $risco->nome . '</li>';

                    $t++;
                }
            }
        }

        $retorno .= '</ul>';

        if ($t == 0) {
            return '<i> nenhum risco relevante</i>';
        }

        return $retorno;
    }

    public function getListaRecomendacaoRelevante()
    {

        $retorno = '';

        $recomendacaoSegurancas = RecomendacaoSeguranca::find()
            ->where([
                'contexto_id' => $this->id,
                'prioridade' => RecomendacaoSeguranca::IMPORTANTE,
                'status' => RecomendacaoSeguranca::ATIVO
            ])
            ->all();

        if (!$recomendacaoSegurancas) {
            $retorno = '<i>nenhuma recomendação relevante.</i>';
        } else {
            $retorno = '<ul>';
            foreach ($recomendacaoSegurancas as $recomendacaoSeguranca) {
                $retorno .= '<li>' . $recomendacaoSeguranca->rotulo . '</li>';
            }
            $retorno .= '</ul>';
        }

        return $retorno;
    }

    public function getLgpdRiscoSoCor()
    {

        $riscoCenario = \app\modules\performance\models\RiscoCenario::find()
            ->select([
                'risco_modelo.id as modeloid',
                'risco_modelo.nome as modelo',
                'cliente.nome as cliente',
                'contexto.id as contextoid',
                'contexto.name as contexto',
                'vertical.nome as vertical',
                'risco_cenario.id',
                'risco_cenario.pontuacao as pontuacao',
            ])
            ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
            ->leftJoin('risco_modelo', 'risco_cenario.risco_modelo_id = risco_modelo.id')
            ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
            ->leftJoin('vertical', 'coleta.vertical_id = vertical.id')
            ->leftJoin('cliente', 'contexto.cliente_id = cliente.id')
            ->where([
                'contexto.id' => $this->id,
                'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
            ])
            ->orderBy('cliente.nome ASC, contexto.name ASC, risco_cenario.id DESC')
            ->asArray()
            ->one();

        if (!$riscoCenario) {
            return '-';
        }

        $faixas = [];

        $riscoCenarioFaixas = RiscoCenarioFaixa::find()
            ->where([
                'risco_cenario_id' => $riscoCenario['id'],
                'status' => RiscoCenarioFaixa::ATIVO
            ])
            ->all();


        if ($riscoCenarioFaixas) {

            foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {

                $faixas[] = [
                    'faixa' => $riscoCenarioFaixa->faixa,
                    'de' => $riscoCenarioFaixa->de,
                    'ate' => $riscoCenarioFaixa->ate,
                    'cor' => $riscoCenarioFaixa->cor,
                ];
            }
        } else {

            $riscoModeloFaixas = RiscoModeloFaixa::find()
                ->where([
                    'risco_modelo_id' => $riscoCenario->risco_modelo_id,
                    'status' => RiscoModeloFaixa::ATIVO
                ])
                ->all();

            if ($riscoModeloFaixas) {

                foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
                    $faixas[] = [
                        'faixa' => $riscoModeloFaixa->faixa,
                        'de' => $riscoModeloFaixa->de,
                        'ate' => $riscoModeloFaixa->ate,
                        'cor' => $riscoModeloFaixa->cor,
                    ];
                }
            } else {
                $faixas = RiscoModeloFaixa::FAIXA_BASE;
            }
        }


        foreach ($faixas as $faixa) {
            if ($riscoCenario['pontuacao'] >= $faixa['de'] && $riscoCenario['pontuacao'] <= $faixa['ate']) {
                return $faixa["cor"];
            }
        }

        /*
        if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
            return '<span class="badge-contexto risco-baixo">Baixo</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
            return '<span class="badge-contexto risco-moderado">Moderado</span>';
        } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
            return '<span class="badge-contexto risco-alto">Alto</span>';
        } else {
            return '<span class="badge-contexto risco-critico">Crítico</span>';
        }

        return '-';
        */
    }

    public function getDimensionamentoold()
    {

        $inventarioScope = InventarioScope::find()
            ->joinWith(['scope', 'inventarioDados'])
            ->where([
                'scope.contexto_id' => $this->id,
                'scope.status' => Scope::ATIVO,
                'inventario_dados.tipo' => InventarioDados::TIPO_DIMENSIONAMENTO,
                'inventario_dados.status' => InventarioDados::ATIVO,
            ])
            ->one();

        if (!$inventarioScope) {

            $scope = Scope::find()
                ->where([
                    'contexto_id' => $this->id,
                    'geral_especifico' => Scope::ESPECIFICO,
                    'status' => Scope::ATIVO
                ])
                ->one();

            if (!$scope) {
                return 'Scope não encontrado';
            }

            $inventarioDados = InventarioDados::find()
                ->where([
                    'tipo' => InventarioDados::TIPO_DIMENSIONAMENTO,
                    'status' => InventarioDados::ATIVO,
                ])
                ->orderBy('id DESC')
                ->one();

            if (!$inventarioDados) {
                return 'Inventário de dados não encontrado';
            }


            $dimensionamento = new InventarioScope();
            $dimensionamento->scope_id = $scope->id;
            $dimensionamento->inventario_dados_id = $inventarioDados->id;
            $dimensionamento->nome = $inventarioDados->nome;
            $dimensionamento->status = self::ATIVO;
            $dimensionamento->created_at = date('Y-m-d H:i:s');
            $dimensionamento->created_by = Yii::$app->user->identity->id ?? null;

            if (!$dimensionamento->save()) {
                throw new HttpException(500, json_encode($dimensionamento->getErrors()));
            }
        }

        $percentual = $inventarioScope->percentual_respondido ?? 0;

        if ($percentual == 0) {
            return 'Não preenchido';
        } elseif ($percentual == 100) {
            return 'Completo';
        } else {
            return 'Incompleto';
        }
    }

    public function getContextoNatureza()
    {
        return $this->hasOne(ContextoNatureza::className(), ['id' => 'contexto_natureza_id']);
    }

    public static function getRiscosPorContextoIds1(array $contextoIds): array
{
    $riscos = [];

    $contextoIds = array_filter(array_map('intval', $contextoIds));
    $contextoIds = array_values(array_unique($contextoIds));

    if (empty($contextoIds)) {
        return $riscos;
    }

    foreach ($contextoIds as $contextoId) {
        $riscos[$contextoId] = '-';
    }

    $riscoCenarios = \app\modules\performance\models\RiscoCenario::find()
        ->alias('risco_cenario')
        ->select([
            'risco_cenario_id' => 'risco_cenario.id',
            'risco_modelo_id' => 'risco_cenario.risco_modelo_id',
            'pontuacao' => 'risco_cenario.pontuacao',
            'contexto_id' => 'contexto.id',
        ])
        ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
        ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
        ->where([
            'contexto.id' => $contextoIds,
            'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
        ])
        ->orderBy([
            'contexto.id' => SORT_ASC,
            'risco_cenario.id' => SORT_DESC,
        ])
        ->asArray()
        ->all();

    if (empty($riscoCenarios)) {
        return $riscos;
    }

    $riscoCenarioPorContexto = [];
    $riscoCenarioIds = [];
    $riscoModeloIds = [];

    foreach ($riscoCenarios as $riscoCenario) {
        $contextoId = (int) $riscoCenario['contexto_id'];

        if (isset($riscoCenarioPorContexto[$contextoId])) {
            continue;
        }

        $riscoCenarioId = (int) $riscoCenario['risco_cenario_id'];
        $riscoModeloId = (int) $riscoCenario['risco_modelo_id'];

        $riscoCenarioPorContexto[$contextoId] = $riscoCenario;

        $riscoCenarioIds[] = $riscoCenarioId;

        if ($riscoModeloId > 0) {
            $riscoModeloIds[] = $riscoModeloId;
        }
    }

    $riscoCenarioIds = array_values(array_unique($riscoCenarioIds));
    $riscoModeloIds = array_values(array_unique($riscoModeloIds));

    $faixasPorRiscoCenario = [];

    if (!empty($riscoCenarioIds)) {
        $riscoCenarioFaixas = \app\modules\risk\models\RiscoCenarioFaixa::find()
            ->select([
                'risco_cenario_id',
                'faixa',
                'de',
                'ate',
                'cor',
            ])
            ->where([
                'risco_cenario_id' => $riscoCenarioIds,
                'status' => \app\modules\risk\models\RiscoCenarioFaixa::ATIVO,
            ])
            ->orderBy([
                'de' => SORT_ASC,
            ])
            ->asArray()
            ->all();

        foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {
            $riscoCenarioId = (int) $riscoCenarioFaixa['risco_cenario_id'];

            if (!isset($faixasPorRiscoCenario[$riscoCenarioId])) {
                $faixasPorRiscoCenario[$riscoCenarioId] = [];
            }

            $faixasPorRiscoCenario[$riscoCenarioId][] = [
                'faixa' => $riscoCenarioFaixa['faixa'],
                'de' => $riscoCenarioFaixa['de'],
                'ate' => $riscoCenarioFaixa['ate'],
                'cor' => $riscoCenarioFaixa['cor'],
            ];
        }
    }

    $faixasPorRiscoModelo = [];

    if (!empty($riscoModeloIds)) {
        $riscoModeloFaixas = \app\modules\risk\models\RiscoCenarioFaixa::find()
            ->select([
                'risco_modelo_id',
                'faixa',
                'de',
                'ate',
                'cor',
            ])
            ->where([
                'risco_modelo_id' => $riscoModeloIds,
                'status' => \app\modules\risk\models\RiscoCenarioFaixa::ATIVO,
            ])
            ->orderBy([
                'de' => SORT_ASC,
            ])
            ->asArray()
            ->all();

        foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
            $riscoModeloId = (int) $riscoModeloFaixa['risco_modelo_id'];

            if (!isset($faixasPorRiscoModelo[$riscoModeloId])) {
                $faixasPorRiscoModelo[$riscoModeloId] = [];
            }

            $faixasPorRiscoModelo[$riscoModeloId][] = [
                'faixa' => $riscoModeloFaixa['faixa'],
                'de' => $riscoModeloFaixa['de'],
                'ate' => $riscoModeloFaixa['ate'],
                'cor' => $riscoModeloFaixa['cor'],
            ];
        }
    }

    foreach ($riscoCenarioPorContexto as $contextoId => $riscoCenario) {
        $riscoCenarioId = (int) $riscoCenario['risco_cenario_id'];
        $riscoModeloId = (int) $riscoCenario['risco_modelo_id'];
        $pontuacao = $riscoCenario['pontuacao'];

        if ($pontuacao === null || $pontuacao === '') {
            $riscos[$contextoId] = '-';
            continue;
        }

        if (isset($faixasPorRiscoCenario[$riscoCenarioId]) && !empty($faixasPorRiscoCenario[$riscoCenarioId])) {
            $faixas = $faixasPorRiscoCenario[$riscoCenarioId];
        } elseif (isset($faixasPorRiscoModelo[$riscoModeloId]) && !empty($faixasPorRiscoModelo[$riscoModeloId])) {
            $faixas = $faixasPorRiscoModelo[$riscoModeloId];
        } else {
            $faixas = \app\modules\performance\models\RiscoModeloFaixa::FAIXA_BASE;
        }

        $riscos[$contextoId] = self::getTextoFaixaRiscoPorPontuacao($pontuacao, $faixas);
    }

    return $riscos;
}

private static function getTextoFaixaRiscoPorPontuacao1($pontuacao, array $faixas): string
{
    if (empty($faixas)) {
        return '-';
    }

    $pontuacao = (float) $pontuacao;

    foreach ($faixas as $faixa) {
        $de = isset($faixa['de']) ? (float) $faixa['de'] : 0;
        $ate = isset($faixa['ate']) ? (float) $faixa['ate'] : 0;

        if ($pontuacao >= $de && $pontuacao <= $ate) {
            return $faixa['faixa'] ?? '-';
        }
    }

    return '-';
}

public static function getRiscosPorContextoIds(array $contextoIds): array
{
    $riscos = [];

    $contextoIds = array_filter(array_map('intval', $contextoIds));
    $contextoIds = array_values(array_unique($contextoIds));

    if (empty($contextoIds)) {
        return $riscos;
    }

    foreach ($contextoIds as $contextoId) {
        $riscos[$contextoId] = '-';
    }

    $riscoCenarios = \app\modules\risk\models\RiscoCenario::find()
        ->alias('risco_cenario')
        ->select([
            'risco_cenario_id' => 'risco_cenario.id',
            'risco_modelo_id' => 'risco_cenario.risco_modelo_id',
            'pontuacao' => 'risco_cenario.pontuacao',
            'contexto_id' => 'contexto.id',
        ])
        ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
        ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
        ->where([
            'contexto.id' => $contextoIds,
            'risco_cenario.status' => \app\modules\risk\models\RiscoCenario::ATIVO,
        ])
        ->orderBy([
            'contexto.id' => SORT_ASC,
            'risco_cenario.id' => SORT_DESC,
        ])
        ->asArray()
        ->all();

    if (empty($riscoCenarios)) {
        return $riscos;
    }

    $riscoCenarioPorContexto = [];
    $riscoCenarioIds = [];
    $riscoModeloIds = [];

    foreach ($riscoCenarios as $riscoCenario) {
        $contextoId = (int) $riscoCenario['contexto_id'];

        if (isset($riscoCenarioPorContexto[$contextoId])) {
            continue;
        }

        $riscoCenarioId = (int) $riscoCenario['risco_cenario_id'];
        $riscoModeloId = (int) $riscoCenario['risco_modelo_id'];

        $riscoCenarioPorContexto[$contextoId] = $riscoCenario;

        if ($riscoCenarioId > 0) {
            $riscoCenarioIds[] = $riscoCenarioId;
        }

        if ($riscoModeloId > 0) {
            $riscoModeloIds[] = $riscoModeloId;
        }
    }

    $riscoCenarioIds = array_values(array_unique($riscoCenarioIds));
    $riscoModeloIds = array_values(array_unique($riscoModeloIds));

    /*
     * Faixas específicas do cenário.
     * Model correto:
     * \app\modules\risk\models\RiscoCenarioFaixa
     */
    $faixasPorRiscoCenario = [];

    if (!empty($riscoCenarioIds)) {
        $riscoCenarioFaixas = \app\modules\risk\models\RiscoCenarioFaixa::find()
            ->alias('risco_cenario_faixa')
            ->select([
                'risco_cenario_id' => 'risco_cenario_faixa.risco_cenario_id',
                'faixa' => 'risco_cenario_faixa.faixa',
                'de' => 'risco_cenario_faixa.de',
                'ate' => 'risco_cenario_faixa.ate',
                'cor' => 'risco_cenario_faixa.cor',
            ])
            ->where([
                'risco_cenario_faixa.risco_cenario_id' => $riscoCenarioIds,
                'risco_cenario_faixa.status' => \app\modules\risk\models\RiscoCenarioFaixa::ATIVO,
            ])
            ->orderBy([
                'risco_cenario_faixa.de' => SORT_ASC,
            ])
            ->asArray()
            ->all();

        foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {
            $riscoCenarioId = (int) $riscoCenarioFaixa['risco_cenario_id'];

            if (!isset($faixasPorRiscoCenario[$riscoCenarioId])) {
                $faixasPorRiscoCenario[$riscoCenarioId] = [];
            }

            $faixasPorRiscoCenario[$riscoCenarioId][] = [
                'faixa' => $riscoCenarioFaixa['faixa'],
                'de' => $riscoCenarioFaixa['de'],
                'ate' => $riscoCenarioFaixa['ate'],
                'cor' => $riscoCenarioFaixa['cor'],
            ];
        }
    }

    /*
     * Faixas do modelo.
     * Estou considerando que RiscoModeloFaixa também está no módulo risk.
     */
    $faixasPorRiscoModelo = [];

    if (!empty($riscoModeloIds)) {
        $riscoModeloFaixas = \app\modules\risk\models\RiscoModeloFaixa::find()
            ->alias('risco_modelo_faixa')
            ->select([
                'risco_modelo_id' => 'risco_modelo_faixa.risco_modelo_id',
                'faixa' => 'risco_modelo_faixa.faixa',
                'de' => 'risco_modelo_faixa.de',
                'ate' => 'risco_modelo_faixa.ate',
                'cor' => 'risco_modelo_faixa.cor',
            ])
            ->where([
                'risco_modelo_faixa.risco_modelo_id' => $riscoModeloIds,
                'risco_modelo_faixa.status' => \app\modules\risk\models\RiscoModeloFaixa::ATIVO,
            ])
            ->orderBy([
                'risco_modelo_faixa.de' => SORT_ASC,
            ])
            ->asArray()
            ->all();

        foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
            $riscoModeloId = (int) $riscoModeloFaixa['risco_modelo_id'];

            if (!isset($faixasPorRiscoModelo[$riscoModeloId])) {
                $faixasPorRiscoModelo[$riscoModeloId] = [];
            }

            $faixasPorRiscoModelo[$riscoModeloId][] = [
                'faixa' => $riscoModeloFaixa['faixa'],
                'de' => $riscoModeloFaixa['de'],
                'ate' => $riscoModeloFaixa['ate'],
                'cor' => $riscoModeloFaixa['cor'],
            ];
        }
    }

    foreach ($riscoCenarioPorContexto as $contextoId => $riscoCenario) {
        $riscoCenarioId = (int) $riscoCenario['risco_cenario_id'];
        $riscoModeloId = (int) $riscoCenario['risco_modelo_id'];
        $pontuacao = $riscoCenario['pontuacao'];

        if ($pontuacao === null || $pontuacao === '') {
            $riscos[$contextoId] = '-';
            continue;
        }

        if (
            isset($faixasPorRiscoCenario[$riscoCenarioId]) &&
            !empty($faixasPorRiscoCenario[$riscoCenarioId])
        ) {
            $faixas = $faixasPorRiscoCenario[$riscoCenarioId];
        } elseif (
            isset($faixasPorRiscoModelo[$riscoModeloId]) &&
            !empty($faixasPorRiscoModelo[$riscoModeloId])
        ) {
            $faixas = $faixasPorRiscoModelo[$riscoModeloId];
        } else {
            $faixas = \app\modules\risk\models\RiscoModeloFaixa::FAIXA_BASE;
        }

        $riscos[$contextoId] = self::getTextoFaixaRiscoPorPontuacao($pontuacao, $faixas);
    }

    return $riscos;
}

private static function getTextoFaixaRiscoPorPontuacao($pontuacao, array $faixas): string
{
    if (empty($faixas)) {
        return '-';
    }

    $pontuacao = (float) $pontuacao;

    foreach ($faixas as $faixa) {
        $de = isset($faixa['de']) ? (float) $faixa['de'] : 0;
        $ate = isset($faixa['ate']) ? (float) $faixa['ate'] : 0;

        if ($pontuacao >= $de && $pontuacao <= $ate) {
            return $faixa['faixa'] ?? '-';
        }
    }

    return '-';
}
}
