<?php

namespace app\modules\risk\controllers;

use Yii;
use app\modules\risk\models\RiscoCenario;
use app\modules\risk\models\RiscoCenarioSearch;
use app\modules\risk\models\Risco;
use app\modules\risk\models\RiscoAnalise;
use app\modules\risk\models\RiscoConsequencia;
use app\modules\risk\models\RiscoProbabilidadeTaxaSubstituicao;
use app\modules\risk\models\RiscoProbabilidadeHistoricoProprio;
use app\modules\risk\models\RiscoProbabilidadeContextoSimilar;
use app\modules\risk\models\RiscoNatureza;
use app\modules\risk\models\RiscoVertical;
use app\modules\risk\models\RiscoModelo;
use app\modules\risk\models\RiscoModeloRisco;
use app\modules\risk\models\RiscoModeloConsequencia;
use app\modules\risk\models\RiscoModeloProbabilidadeTaxaSubstituicao;
use app\modules\risk\models\RiscoModeloProbabilidadeHistoricoProprio;
use app\modules\risk\models\RiscoModeloProbabilidadeContextoSimilar;
use app\modules\risk\models\RiscoModeloRiscoVertical;
use app\modules\performance\models\Vertical;
use app\modules\performance\models\Coleta;
use app\modules\performance\models\Contexto;
use app\modules\performance\models\Cliente;
use app\modules\performance\models\Timeline;
use app\modules\performance\models\ContextoTemParametro;
use app\models\GenericSearch;
use app\models\UserHasResource;
use app\components\Utils;
use app\controllers\BaseController;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\web\HttpException;
use yii\helpers\ArrayHelper;
use yii\helpers\Json;
use yii\data\ArrayDataProvider;
use yii\filters\VerbFilter;
use yii\db\Query;

/**
 * RiscoCenarioController implements the CRUD actions for RiscoCenario model.
 */
class RiscoCenarioController extends BaseController
{

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

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

        \app\models\Base::loga("Acessou a lista de Cenários de Risco", $_GET, $_POST, 2);

        $myClientes = GenericSearch::filterMyClientesRiskGestor()
            ->query
            ->select('cliente.id')
            ->column();

        $searchModel = new RiscoCenarioSearch();

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

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

        $dataProvider->pagination->pageSize = 10;

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

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

    /**
     * Displays a single RiscoCenario model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id)
    {

        \app\models\Base::loga("Acessou a visualização de Cenário de Risco", $_GET, $_POST, 2);

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

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

        $riscosCategorias = RiscoModelo::riscoCategoria($model->riscoModelo);

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

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

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

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

        $probabilidadesValores = RiscoCenario::probabilidadeValores($model);

        $consequenciaT = explode(",", str_replace("]", "", str_replace("[", "", $consequenciasValores)));
        $probabilidadeT = explode(",", str_replace("]", "", str_replace("[", "", $probabilidadesValores)));
        $consequenciaProbabilidade = [];

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

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

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

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

        foreach ($cenarios as $cenario) {

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

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

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

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

            foreach ($riscos as $risco) {

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

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

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


                if ($pontuacaoRisco <= 25) {
                    $corRisco = $coresPadrao[0];
                } elseif ($pontuacaoRisco <= 50) {
                    $corRisco = $coresPadrao[1];
                } elseif ($pontuacaoRisco <= 75) {
                    $corRisco = $coresPadrao[2];
                } else {
                    $corRisco = $coresPadrao[3];
                }

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

                $r++;
            }

            $todosCenariosDrilldrown[] = [
                'id' => 'd' . $cenario->id,
                'name' => $cenario->nome,
                'data' => $dataRisco,
            ];
        }

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

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

        $myClientesGestor = GenericSearch::filterMyClientesRiskGestor()
            ->query
            ->column();

        $permiteCriarAtualizarExcluir = in_array($model->coletaVinculo->contexto->cliente_id, $myClientesGestor);

        return $this->render('view', [
            'model' => $model,
            'origem' => 'view',
            'botoes' => true,
            'avisaPendencia' => true,
            'grafico' => false,
            'todosCenarios' => $todosCenarios,
            'todosCenariosPontuacao' => $todosCenariosPontuacao,
            'todosRiscos' => $todosRiscos,
            'maxPontuacaoRisco' => $maxPontuacaoRisco,
            'riscosCategorias' => $riscosCategorias,
            'parametrosLabel' => $parametrosLabel,
            'contexto' => $contexto,
            'cores' => $cores,
            'coresPadrao' => $coresPadrao,
            'todosCenariosDrilldrown' => $todosCenariosDrilldrown,
            'permiteCriarAtualizarExcluir' => $permiteCriarAtualizarExcluir,
        ]);
    }

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

        $model = new RiscoCenario();

        $model->default = 0;

        $myClientes = GenericSearch::filterMyClientesRiskGestor()
            ->query
            ->select('cliente.id')
            ->column();

        $modelos = ArrayHelper::map(RiscoModelo::find()
            ->where([
                'status' => RiscoModelo::ATIVO
            ])
            ->andWhere(['in', 'cliente_id', $myClientes])
            ->all(), 'id', 'nome');

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

            \app\models\Base::loga("Criou Cenário de Risco", $_GET, $_POST, 2);

            $valid = true;

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

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

                $model->created_by = Yii::$app->user->identity->id ?? null;
                $model->created_at = date('Y-m-d H:i:s');

                if ($valid) {
                    if (!$model->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECCR1 - Erro ao cadastrar o Cenário de Risco, motivo: " . json_encode($model->getErrors()));
                    }
                }

                if ($valid) {

                    if ($model->risco_modelo_id) {
                        $riscosModelo = $model
                            ->riscoModelo
                            ->getRiscoModeloRiscos()
                            ->andWhere(['status' => RiscoModeloRisco::ATIVO])
                            ->all();

                        foreach ($riscosModelo as $riscoModelo) {
                            if ($valid) {

                                $risco = new Risco();
                                $risco->nome = $riscoModelo->nome;
                                $risco->descricao = $riscoModelo->descricao;
                                $risco->taxa_substituicao = $riscoModelo->taxa_substituicao;
                                $risco->risco_cenario_id = $model->id;
                                $risco->status = Risco::ATIVO;
                                $risco->created_by = \Yii::$app->user->identity->id ?? null;
                                $risco->created_at = date('Y-m-d H:i:s');
                                $risco->analise = $riscoModelo->analise;
                                $risco->risco_natureza_id = $riscoModelo->risco_natureza_id;

                                if (!$risco->save()) {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECCR2 - Erro ao cadastrar o Risco, motivo: " . json_encode($risco->getErrors()));
                                }

                                $riscoModeloConsequencias = RiscoModeloConsequencia::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                    ])
                                    ->andWhere(['!=', 'status', RiscoModeloConsequencia::INATIVO,])
                                    ->all();

                                foreach ($riscoModeloConsequencias as $riscoModeloConsequencia) {

                                    $riscoConsequencia = new RiscoConsequencia();
                                    $riscoConsequencia->risco_id = $risco->id;
                                    $riscoConsequencia->descritor = $riscoModeloConsequencia->descritor;
                                    $riscoConsequencia->eo = $riscoModeloConsequencia->eo;
                                    $riscoConsequencia->ec = (string) $riscoModeloConsequencia->ec;
                                    $riscoConsequencia->nr = $riscoModeloConsequencia->nr;
                                    $riscoConsequencia->status = $riscoModeloConsequencia->status;
                                    $riscoConsequencia->created_by = \Yii::$app->user->identity->id ?? null;
                                    $riscoConsequencia->created_at = date('Y-m-d H:i:s');

                                    if (!$riscoConsequencia->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECCR3 - Erro ao cadastrar a Consequência, motivo: " . json_encode($riscoConsequencia->getErrors()));
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoTaxaProbabilidadeModelo = RiscoModeloProbabilidadeTaxaSubstituicao::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                        'status' => RiscoModeloProbabilidadeTaxaSubstituicao::ATIVO,
                                    ])
                                    ->one();
                                if ($riscoTaxaProbabilidadeModelo) {

                                    $riscoTaxaProbabilidade = new RiscoProbabilidadeTaxaSubstituicao();
                                    $riscoTaxaProbabilidade->risco_id = $risco->id;
                                    $riscoTaxaProbabilidade->historico_proprio = $riscoTaxaProbabilidadeModelo->historico_proprio;
                                    $riscoTaxaProbabilidade->contexto_similar = $riscoTaxaProbabilidadeModelo->contexto_similar;
                                    $riscoTaxaProbabilidade->condicao_vulnerabilidade = $riscoTaxaProbabilidadeModelo->condicao_vulnerabilidade;
                                    $riscoTaxaProbabilidade->status = RiscoModeloProbabilidadeTaxaSubstituicao::ATIVO;
                                    $riscoTaxaProbabilidade->created_by = \Yii::$app->user->identity->id ?? null;
                                    $riscoTaxaProbabilidade->created_at = date('Y-m-d H:i:s');

                                    if (!$riscoTaxaProbabilidade->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECR4 - Erro ao salvar a taxa de substituição do risco, motivo: " . json_encode($riscoTaxaProbabilidade->getErrors()));
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoHistoricoProprioProbabilidades = RiscoModeloProbabilidadeHistoricoProprio::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                        'status' => RiscoModeloProbabilidadeHistoricoProprio::ATIVO,
                                    ])
                                    ->all();

                                foreach ($riscoHistoricoProprioProbabilidades as $riscoHistoricoProprioProbabilidade) {

                                    if ($valid) {

                                        $riscoHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
                                        $riscoHistoricoProprio->risco_id = $risco->id;
                                        $riscoHistoricoProprio->descritor = $riscoHistoricoProprioProbabilidade->descritor;
                                        $riscoHistoricoProprio->eo = $riscoHistoricoProprioProbabilidade->eo;
                                        $riscoHistoricoProprio->ec = (string) $riscoHistoricoProprioProbabilidade->ec;
                                        $riscoHistoricoProprio->nr = $riscoHistoricoProprioProbabilidade->nr;
                                        $riscoHistoricoProprio->status = RiscoProbabilidadeHistoricoProprio::ATIVO;
                                        $riscoHistoricoProprio->created_by = \Yii::$app->user->identity->id ?? null;
                                        $riscoHistoricoProprio->created_at = date('Y-m-d H:i:s');

                                        if (!$riscoHistoricoProprio->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECR5 - Erro ao salvar a taxa de probabilidade do histórico próprio do risco, motivo: " . json_encode($riscoHistoricoProprio->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoContextoSimilarProbabilidades = RiscoModeloProbabilidadeContextoSimilar::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                        'status' => RiscoModeloProbabilidadeContextoSimilar::ATIVO,
                                    ])
                                    ->all();

                                foreach ($riscoContextoSimilarProbabilidades as $riscoContextoSimilarProbabilidade) {

                                    if ($valid) {

                                        $riscoContextoSimilar = new RiscoProbabilidadeContextoSimilar();
                                        $riscoContextoSimilar->risco_id = $risco->id;
                                        $riscoContextoSimilar->descritor = $riscoContextoSimilarProbabilidade->descritor;
                                        $riscoContextoSimilar->eo = $riscoContextoSimilarProbabilidade->eo;
                                        $riscoContextoSimilar->ec = (string) $riscoContextoSimilarProbabilidade->ec;
                                        $riscoContextoSimilar->nr = $riscoContextoSimilarProbabilidade->nr;
                                        $riscoContextoSimilar->status = $riscoContextoSimilarProbabilidade::ATIVO;
                                        $riscoContextoSimilar->created_by = \Yii::$app->user->identity->id ?? null;
                                        $riscoContextoSimilar->created_at = date('Y-m-d H:i:s');

                                        if (!$riscoContextoSimilar->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECR6 - Erro ao salvar a taxa de probabilidade do contexto similar do risco, motivo: " . json_encode($riscoContextoSimilar->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoModeloVerticais = RiscoModeloRiscoVertical::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                    ])
                                    ->all();

                                foreach ($riscoModeloVerticais as $riscoModeloVertical) {

                                    if ($valid) {

                                        $riscoVertical = new RiscoVertical();
                                        $riscoVertical->risco_id = $risco->id;
                                        $riscoVertical->chave = $riscoModeloVertical->chave;
                                        $riscoVertical->parent = $riscoModeloVertical->parent;
                                        $riscoVertical->parent_id = $riscoModeloVertical->parent_id;
                                        $riscoVertical->texto = $riscoModeloVertical->texto;
                                        $riscoVertical->tipo = $riscoModeloVertical->tipo;
                                        $riscoVertical->taxa_substituicao = $riscoModeloVertical->taxa_substituicao;
                                        $riscoVertical->created_by = \Yii::$app->user->identity->id ?? null;
                                        $riscoVertical->created_at = date('Y-m-d H:i:s');
                                        $riscoVertical->status = $riscoModeloVertical->status;

                                        if (!$riscoVertical->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECR7 - Erro ao salvar o item da vertical do risco, motivo: " . json_encode($riscoVertical->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {
                                $geraPontuacao = $risco->getGeraPontuacaoAnalise();
                                if (!$geraPontuacao) {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECR10 - Erro ao gerar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage());
                                }
                            }

                            if ($valid) {
                                $risco->pendencia = $risco->getPendencia();
                                if (!$risco->save()) {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECR8 - Erro ao salvar a pendência do risco, motivo: " . json_encode($risco->getErrors()));
                                }
                            }
                        }
                    }

                    //Utils::debug($riscosModelo);
                    if ($valid) {
                        $transaction->commit();

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

        \app\models\Base::loga("Acessou a criação de Cenário de Risco", $_GET, $_POST, 2);

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

    /**
     * Updates an existing RiscoCenario model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionUpdate($id)
    {

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

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

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

        $coletaVinculoOriginal = $model->coleta_vinculo;
        $modeloOriginal = $model->risco_modelo_id;

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

            \app\models\Base::loga("Atualiou o Cenário de Risco", $_GET, $_POST, 2);

            $valid = true;

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

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

                $model->updated_by = \Yii::$app->user->identity->id ?? null;
                $model->updated_at = date('Y-m-d H:i:s');

                if ($valid) {
                    if (!$model->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECCR1 - Erro ao cadastrar o Cenário de Risco, motivo: " . json_encode($model->getErrors()));
                    }
                }

                if ($valid) {
                    if ($model->coleta_vinculo != $coletaVinculoOriginal) {

                        //atualizar para nova pontuação
                        //                        $riscosId = $model->getRiscos()->select('id')->andWhere('status=1')->column();
                        //
                        //                        if ($riscosId) {
                        //                            \Yii::$app
                        //                                    ->db
                        //                                    ->createCommand()
                        //                                    ->delete('risco_vertical', ['risco_id' => $riscosId])
                        //                                    ->execute();
                        //                        }
                    }
                }

                if ($valid) {

                    if ($model->risco_modelo_id != $modeloOriginal) {

                        Risco::updateAll(['status' => Risco::INATIVO], ['risco_cenario_id' => $model->id]);
                        $riscosModelo = $model
                            ->riscoModelo
                            ->getRiscoModeloRiscos()
                            ->andWhere(['status' => RiscoModeloRisco::ATIVO])
                            ->all();

                        foreach ($riscosModelo as $riscoModelo) {
                            if ($valid) {

                                $risco = new Risco();
                                $risco->nome = $riscoModelo->nome;
                                $risco->descricao = $riscoModelo->descricao;
                                $risco->taxa_substituicao = $riscoModelo->taxa_substituicao;
                                $risco->risco_cenario_id = $model->id;
                                $risco->status = Risco::ATIVO;
                                $risco->created_by = \Yii::$app->user->identity->id ?? null;
                                $risco->created_at = date('Y-m-d H:i:s');
                                $risco->analise = $riscoModelo->analise;
                                $risco->risco_natureza_id = $riscoModelo->risco_natureza_id;

                                if (!$risco->save()) {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECCR2 - Erro ao cadastrar o Risco, motivo: " . json_encode($risco->getErrors()));
                                }

                                $riscoModeloConsequencias = RiscoModeloConsequencia::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                    ])
                                    ->andWhere(['!=', 'status', RiscoModeloConsequencia::INATIVO,])
                                    ->all();

                                foreach ($riscoModeloConsequencias as $riscoModeloConsequencia) {

                                    $riscoConsequencia = new RiscoConsequencia();
                                    $riscoConsequencia->risco_id = $risco->id;
                                    $riscoConsequencia->descritor = $riscoModeloConsequencia->descritor;
                                    $riscoConsequencia->eo = $riscoModeloConsequencia->eo;
                                    $riscoConsequencia->ec = (string) $riscoModeloConsequencia->ec;
                                    $riscoConsequencia->nr = $riscoModeloConsequencia->nr;
                                    $riscoConsequencia->status = $riscoModeloConsequencia->status;
                                    $riscoConsequencia->created_by = \Yii::$app->user->identity->id ?? null;
                                    $riscoConsequencia->created_at = date('Y-m-d H:i:s');

                                    if (!$riscoConsequencia->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECCR3 - Erro ao cadastrar a Consequência, motivo: " . json_encode($riscoConsequencia->getErrors()));
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoTaxaProbabilidadeModelo = RiscoModeloProbabilidadeTaxaSubstituicao::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                        'status' => RiscoModeloProbabilidadeTaxaSubstituicao::ATIVO,
                                    ])
                                    ->one();
                                if ($riscoTaxaProbabilidadeModelo) {

                                    $riscoTaxaProbabilidade = new RiscoProbabilidadeTaxaSubstituicao();
                                    $riscoTaxaProbabilidade->risco_id = $risco->id;
                                    $riscoTaxaProbabilidade->historico_proprio = $riscoTaxaProbabilidadeModelo->historico_proprio;
                                    $riscoTaxaProbabilidade->contexto_similar = $riscoTaxaProbabilidadeModelo->contexto_similar;
                                    $riscoTaxaProbabilidade->condicao_vulnerabilidade = $riscoTaxaProbabilidadeModelo->condicao_vulnerabilidade;
                                    $riscoTaxaProbabilidade->status = RiscoModeloProbabilidadeTaxaSubstituicao::ATIVO;
                                    $riscoTaxaProbabilidade->created_by = \Yii::$app->user->identity->id ?? null;
                                    $riscoTaxaProbabilidade->created_at = date('Y-m-d H:i:s');

                                    if (!$riscoTaxaProbabilidade->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECR4 - Erro ao salvar a taxa de substituição do risco, motivo: " . json_encode($riscoTaxaProbabilidade->getErrors()));
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoHistoricoProprioProbabilidades = RiscoModeloProbabilidadeHistoricoProprio::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                        'status' => RiscoModeloProbabilidadeHistoricoProprio::ATIVO,
                                    ])
                                    ->all();

                                foreach ($riscoHistoricoProprioProbabilidades as $riscoHistoricoProprioProbabilidade) {

                                    if ($valid) {

                                        $riscoHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
                                        $riscoHistoricoProprio->risco_id = $risco->id;
                                        $riscoHistoricoProprio->descritor = $riscoHistoricoProprioProbabilidade->descritor;
                                        $riscoHistoricoProprio->eo = $riscoHistoricoProprioProbabilidade->eo;
                                        $riscoHistoricoProprio->ec = (string) $riscoHistoricoProprioProbabilidade->ec;
                                        $riscoHistoricoProprio->nr = $riscoHistoricoProprioProbabilidade->nr;
                                        $riscoHistoricoProprio->status = RiscoProbabilidadeHistoricoProprio::ATIVO;
                                        $riscoHistoricoProprio->created_by = \Yii::$app->user->identity->id ?? null;
                                        $riscoHistoricoProprio->created_at = date('Y-m-d H:i:s');

                                        if (!$riscoHistoricoProprio->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECR5 - Erro ao salvar a taxa de probabilidade do histórico próprio do risco, motivo: " . json_encode($riscoHistoricoProprio->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoContextoSimilarProbabilidades = RiscoModeloProbabilidadeContextoSimilar::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                        'status' => RiscoModeloProbabilidadeContextoSimilar::ATIVO,
                                    ])
                                    ->all();

                                foreach ($riscoContextoSimilarProbabilidades as $riscoContextoSimilarProbabilidade) {

                                    if ($valid) {

                                        $riscoContextoSimilar = new RiscoProbabilidadeContextoSimilar();
                                        $riscoContextoSimilar->risco_id = $risco->id;
                                        $riscoContextoSimilar->descritor = $riscoContextoSimilarProbabilidade->descritor;
                                        $riscoContextoSimilar->eo = $riscoContextoSimilarProbabilidade->eo;
                                        $riscoContextoSimilar->ec = (string) $riscoContextoSimilarProbabilidade->ec;
                                        $riscoContextoSimilar->nr = $riscoContextoSimilarProbabilidade->nr;
                                        $riscoContextoSimilar->status = $riscoContextoSimilarProbabilidade::ATIVO;
                                        $riscoContextoSimilar->created_by = \Yii::$app->user->identity->id ?? null;
                                        $riscoContextoSimilar->created_at = date('Y-m-d H:i:s');

                                        if (!$riscoContextoSimilar->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECR6 - Erro ao salvar a taxa de probabilidade do contexto similar do risco, motivo: " . json_encode($riscoContextoSimilar->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {

                                $riscoModeloVerticais = RiscoModeloRiscoVertical::find()
                                    ->where([
                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                    ])
                                    ->all();

                                foreach ($riscoModeloVerticais as $riscoModeloVertical) {

                                    if ($valid) {

                                        $riscoVertical = new RiscoVertical();
                                        $riscoVertical->risco_id = $risco->id;
                                        $riscoVertical->chave = $riscoModeloVertical->chave;
                                        $riscoVertical->parent = $riscoModeloVertical->parent;
                                        $riscoVertical->parent_id = $riscoModeloVertical->parent_id;
                                        $riscoVertical->texto = $riscoModeloVertical->texto;
                                        $riscoVertical->tipo = $riscoModeloVertical->tipo;
                                        $riscoVertical->taxa_substituicao = $riscoModeloVertical->taxa_substituicao;
                                        $riscoVertical->created_by = \Yii::$app->user->identity->id ?? null;
                                        $riscoVertical->created_at = date('Y-m-d H:i:s');

                                        if (!$riscoVertical->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECR7 - Erro ao salvar o item da vertical do risco, motivo: " . json_encode($riscoVertical->getErrors()));
                                        }
                                    }
                                }
                            }

                            if ($valid) {
                                $risco->pendencia = $risco->getPendencia();
                                if (!$risco->save()) {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECR8 - Erro ao salvar a pendência do risco, motivo: " . json_encode($risco->getErrors()));
                                }
                            }
                        }
                    }

                    //Utils::debug($riscosModelo);
                }

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

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


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

        \app\models\Base::loga("Acessou a atualização Cenário de Risco", $_GET, $_POST, 2);

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

    /**
     * Deletes an existing RiscoCenario model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionDelete($id, $origem = 'index')
    {

        \app\models\Base::loga("Excluiu Cenário de Risco", $_GET, $_POST, 2);

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

        $valid = true;

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

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

            $model->status = RiscoCenario::INATIVO;

            if ($valid) {
                if (!$model->save()) {
                    $valid = false;
                    \Yii::$app->session->setFlash('error', "ECCR1 - Erro ao cadastrar o Cenário de Risco, motivo: " . json_encode($model->getErrors()));
                }
            }

            if ($valid) {
                $riscosId = $model->getRiscos()->select('id')->andWhere('status=1')->column();
                if ($riscosId) {
                    \Yii::$app
                        ->db
                        ->createCommand()
                        ->delete('risco_vertical', ['risco_id' => $riscosId])
                        ->execute();
                }
            }

            if ($valid) {
                Risco::updateAll(['status' => Risco::INATIVO], ['risco_cenario_id' => $model->id]);
            }


            if ($valid) {
                $transaction->commit();
            } else {
                $transaction->rollback();
            }
        } catch (Exception $ex) {
            $transaction->rollback();
        }



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


        if ($valid) {

            if ($origem == 'view') {
                return $this->redirect(['index']);
            }

            return true;
        }
    }

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

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

    public function actionCreateRisco($cenario_id)
    {

        $cenarioRisco = RiscoCenario::find()
            ->where([
                'id' => $cenario_id,
                'status' => RiscoModelo::ATIVO,
            ])
            ->one();

        if (!$cenarioRisco) {
            throw new HttpException(500, "Erro: Cenário de Risco não encontrado");
        }


        $model = new Risco();
        $model->risco_cenario_id = $cenarioRisco->id;
        $model->created_by = \Yii::$app->user->identity->id ?? null;
        $model->created_at = date('Y-m-d H:i:s');

        $consequencia = new RiscoConsequencia();
        $consequencias = RiscoModeloConsequencia::consequenciaPadrao($cenarioRisco);

        $taxaProbabilidade = new RiscoProbabilidadeTaxaSubstituicao();

        $probabilidadeHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
        $historicoProprios = RiscoModeloProbabilidadeHistoricoProprio::historicoProprioPadrao();

        $probabilidadeContextoSimilar = new RiscoProbabilidadeContextoSimilar();
        $contextoSimiliares = RiscoModeloProbabilidadeContextoSimilar::contextoSimilarPadrao();

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


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

        if ($model->load($post)) {

            \app\models\Base::loga("Cadastrou o Risco do Cenário", $_GET, $_POST, 2);

            $taxaProbabilidade->load(Yii::$app->request->post());

            $valid = true;

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

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

                if (!$model->save()) {
                    $valid = false;
                    \Yii::$app->session->setFlash('error', "ECR1 - Erro ao salvar o risco, motivo: " . json_encode($model->getErrors()));
                }

                if ($valid) {
                    foreach ($_POST['RiscoConsequencia']['ec'] as $key => $consequenciaItem) {
                        $modelConsequencia = new RiscoConsequencia();
                        $modelConsequencia->risco_id = $model->id;

                        if ((float) $consequenciaItem == 0) {
                            $pontuacao = 1;
                        } else {
                            $pontuacao = $consequenciaItem;
                        }

                        $modelConsequencia->ec = $pontuacao;
                        $modelConsequencia->descritor = $_POST['RiscoConsequencia']['descritor'][$key];
                        $modelConsequencia->nr = $_POST['RiscoConsequencia']['eo'][$key];

                        $status = RiscoConsequencia::ATIVO;
                        if (
                            isset($_POST['RiscoConsequencia']['selecionado'][$key]) && $_POST['RiscoConsequencia']['selecionado'][$key] == 1
                        ) {
                            $status = RiscoConsequencia::SELECIONADO;
                            $model->consequencia_valor = $consequenciaItem;
                            $model->consequencia_descricao = $_POST['RiscoConsequencia']['descritor'][$key];
                        }

                        $modelConsequencia->status = $status;
                        $modelConsequencia->created_by = \Yii::$app->user->identity->id ?? null;
                        $modelConsequencia->created_at = date('Y-m-d H:i:s');

                        if (!$modelConsequencia->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECR3 - Erro ao salvar a consequência do risco, motivo: " . json_encode($modelConsequencia->getErrors()));
                        }
                    }
                }

                if ($valid) {
                    $taxaProbabilidade->risco_id = $model->id;
                    $taxaProbabilidade->status = RiscoProbabilidadeTaxaSubstituicao::ATIVO;
                    $taxaProbabilidade->created_by = \Yii::$app->user->identity->id ?? null;
                    $taxaProbabilidade->created_at = date('Y-m-d H:i:s');

                    if (!$taxaProbabilidade->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR4 - Erro ao salvar a taxa de substituição do risco, motivo: " . json_encode($taxaProbabilidadeModelo->getErrors()));
                    }
                }

                if ($valid) {
                    foreach ($_POST['RiscoProbabilidadeHistoricoProprio']['ec'] as $key => $historicoProprioItem) {

                        $modelHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
                        $modelHistoricoProprio->risco_id = $model->id;
                        $modelHistoricoProprio->ec = $historicoProprioItem;
                        $modelHistoricoProprio->nr = $_POST['RiscoProbabilidadeHistoricoProprio']['eo'][$key];
                        $modelHistoricoProprio->descritor = $_POST['RiscoProbabilidadeHistoricoProprio']['descritor'][$key];

                        $status = RiscoProbabilidadeHistoricoProprio::ATIVO;
                        if (
                            isset($_POST['RiscoProbabilidadeHistoricoProprio']['selecionado'][$key]) && $_POST['RiscoProbabilidadeHistoricoProprio']['selecionado'][$key] == 1
                        ) {
                            $status = RiscoProbabilidadeHistoricoProprio::SELECIONADO;
                        }

                        $modelHistoricoProprio->status = $status;
                        $modelHistoricoProprio->created_by = \Yii::$app->user->identity->id ?? null;
                        $modelHistoricoProprio->created_at = date('Y-m-d H:i:s');

                        if (!$modelHistoricoProprio->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECR5 - Erro ao salvar a probabilidade do histórico próprio do risco, motivo: " . json_encode($modelHistoricoProprio->getErrors()));
                        }
                    }
                }

                if ($valid) {
                    foreach ($_POST['RiscoProbabilidadeContextoSimilar']['ec'] as $key => $contextoSimilarItem) {

                        $modelContextoSimilar = new RiscoProbabilidadeContextoSimilar();
                        $modelContextoSimilar->risco_id = $model->id;
                        $modelContextoSimilar->ec = $contextoSimilarItem;
                        $modelContextoSimilar->nr = $_POST['RiscoProbabilidadeContextoSimilar']['eo'][$key];
                        $modelContextoSimilar->descritor = $_POST['RiscoProbabilidadeContextoSimilar']['descritor'][$key];

                        $status = RiscoProbabilidadeContextoSimilar::ATIVO;
                        if (
                            isset($_POST['RiscoProbabilidadeContextoSimilar']['selecionado'][$key]) && $_POST['RiscoProbabilidadeContextoSimilar']['selecionado'][$key] == 1
                        ) {
                            $status = RiscoProbabilidadeContextoSimilar::SELECIONADO;
                        }

                        $modelContextoSimilar->status = $status;
                        $modelContextoSimilar->created_by = \Yii::$app->user->identity->id ?? null;
                        $modelContextoSimilar->created_at = date('Y-m-d H:i:s');

                        if (!$modelContextoSimilar->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECR6 - Erro ao salvar a probabilidade do contexto similar do risco, motivo: " . json_encode($modelContextoSimilar->getErrors()));
                        }
                    }
                }

                if ($valid) {
                    $itensVertical = RiscoVertical::find()
                        ->where(['chave' => $model->chave])
                        ->all();

                    foreach ($itensVertical as $item) {
                        $item->risco_id = $model->id;
                        if (!$item->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECR8 - Erro ao salvar o item da vertical d risco, motivo: " . json_encode($item->getErrors()));
                        }
                    }
                }

                if ($valid) {
                    $model->pendencia = $model->getPendencia();
                    if (!$model->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR7 - Erro ao salvar a pendência do risco, motivo: " . json_encode($model->getErrors()));
                    }
                }

                if ($valid) {
                    $geraPontuacao = $model->getGeraPontuacaoAnalise();
                    if (!$geraPontuacao) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR10 - Erro ao gerar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage());
                    }
                }

                if ($valid) {
                    $geraProbabilidade = $model->getGeraProbabilidade();
                    if (!$geraProbabilidade) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR11 - Erro ao gerar a probabilidade do risco, motivo: " . $geraProbabilidade->getMessage());
                    }
                }

                if ($valid) {
                    $geraPontuacaoRisco = $model->getGeraPontuacao();
                    if (!$geraPontuacaoRisco) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR12 - Erro ao gerar a pontuacao do risco, motivo: " . $geraProbabilidade->getMessage());
                    }
                }



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

                    $this->redirect(['/risk/risco-cenario/view', 'id' => $model->risco_cenario_id]);
                } else {
                    $transaction->rollback();
                }
            } catch (Exception $ex) {

                $transaction->rollback();
            }
        }

        \app\models\Base::loga("Acessou a criação de Risco do cenário", $_GET, $_POST, 2);

        return $this->render('create-risco', [
            'model' => $model,
            'naturezas' => $naturezas,
            'consequencias' => $consequencias,
            'taxaProbabilidade' => $taxaProbabilidade,
            'historicoProprios' => $historicoProprios,
            'contextoSimiliares' => $contextoSimiliares,
            'cenarioRisco' => $cenarioRisco,
        ]);
    }

    public function actionUpdateRisco($id, $origem = 'analise', $aplicacao = null, $contexto = null, $layout = null)
    {

        if ($layout) {
            $this->layout = '//empty';
        }

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

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

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

        if (!$cenarioRisco) {
            throw new HttpException(500, "Erro: Cenário de Risco não encontrado");
        }

        if ($cenarioRisco->coletaVinculo->contexto->tipoLicenca != 'Licenciado') {
            throw new HttpException(500, 'Cliente não Licenciado');
        }

        $riscoVertical = RiscoVertical::find()
            ->where([
                'risco_id' => $model->id,
            ])
            ->one();
        if ($riscoVertical) {
            $model->chave = $riscoVertical->chave;
        }

        $model->updated_by = \Yii::$app->user->identity->id ?? null;
        $model->updated_at = date('Y-m-d H:i:s');

        $consequencia = new RiscoConsequencia();
        $consequencias = [];
        $consequenciasRisco = $model
            ->getRiscoConsequencias()
            ->andWhere(['!=', 'status', RiscoConsequencia::INATIVO])
            ->orderBy('ec DESC')
            ->all();
        foreach ($consequenciasRisco as $consequenciaRisco) {
            $consequencias[] = [
                'descritor' => $consequenciaRisco->descritor,
                'eo' => $consequenciaRisco->nr,
                'ec' => $consequenciaRisco->ec,
                'nr' => $consequenciaRisco->nr,
                'status' => $consequenciaRisco->status,
            ];
        }

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

        if (!$taxaProbabilidade) {
            $taxaProbabilidade = new RiscoProbabilidadeTaxaSubstituicao();
        }

        $probabilidadeHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
        $historicoProprios = [];
        $riscosProbabilidadeHistoricoProprioRisco = RiscoProbabilidadeHistoricoProprio::find()
            ->where([
                'risco_id' => $model->id,
            ])
            ->andWhere(['!=', 'status', RiscoProbabilidadeHistoricoProprio::INATIVO])
            ->orderBy('ec DESC')
            ->all();
        foreach ($riscosProbabilidadeHistoricoProprioRisco as $riscoProbabilidadeHistoricoProprioRisco) {
            $historicoProprios[] = [
                'descritor' => $riscoProbabilidadeHistoricoProprioRisco->descritor,
                'eo' => $riscoProbabilidadeHistoricoProprioRisco->nr,
                'ec' => $riscoProbabilidadeHistoricoProprioRisco->ec,
                'nr' => $riscoProbabilidadeHistoricoProprioRisco->nr,
                'status' => $riscoProbabilidadeHistoricoProprioRisco->status,
            ];
        }

        $probabilidadeContextoSimilar = new RiscoProbabilidadeContextoSimilar();
        $contextoSimiliares = [];
        $riscosProbabilidadeContextoSimilarRisco = RiscoProbabilidadeContextoSimilar::find()
            ->where([
                'risco_id' => $model->id,
            ])
            ->andWhere(['!=', 'status', RiscoProbabilidadeContextoSimilar::INATIVO])
            ->orderBy('ec DESC')
            ->all();
        foreach ($riscosProbabilidadeContextoSimilarRisco as $riscoProbabilidadeContextoSimilarRisco) {
            $contextoSimiliares[] = [
                'descritor' => $riscoProbabilidadeContextoSimilarRisco->descritor,
                'eo' => $riscoProbabilidadeContextoSimilarRisco->nr,
                'ec' => $riscoProbabilidadeContextoSimilarRisco->ec,
                'nr' => $riscoProbabilidadeContextoSimilarRisco->nr,
                'status' => $riscoProbabilidadeContextoSimilarRisco->status,
            ];
        }


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

        if ($model->load($post)) {

            \app\models\Base::loga("Atualizou o Risco do Cenário", $_GET, $_POST, 2);

            $taxaProbabilidade->load($post);

            $valid = true;

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

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

                if (!$model->save()) {
                    $valid = false;
                    \Yii::$app->session->setFlash('error', "ECR1 - Erro ao salvar o risco, motivo: " . json_encode($model->getErrors()));
                }
                if ($valid) {

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

                    foreach ($_POST['RiscoConsequencia']['ec'] as $key => $consequenciaItem) {
                        $modelConsequencia = new RiscoConsequencia();
                        $modelConsequencia->risco_id = $model->id;

                        if ((float) $consequenciaItem == 0) {
                            $pontuacao = 1;
                        } else {
                            $pontuacao = $consequenciaItem;
                        }

                        $modelConsequencia->ec = $pontuacao;
                        $modelConsequencia->descritor = $_POST['RiscoConsequencia']['descritor'][$key];
                        $modelConsequencia->nr = $_POST['RiscoConsequencia']['eo'][$key];

                        $status = RiscoConsequencia::ATIVO;
                        if (
                            isset($_POST['RiscoConsequencia']['selecionado'][$key]) && $_POST['RiscoConsequencia']['selecionado'][$key] == 1
                        ) {
                            $status = RiscoConsequencia::SELECIONADO;
                            $model->consequencia_valor = $consequenciaItem;
                            $model->consequencia_descricao = $_POST['RiscoConsequencia']['descritor'][$key];
                        }

                        $modelConsequencia->status = $status;
                        $modelConsequencia->created_by = \Yii::$app->user->identity->id ?? null;
                        $modelConsequencia->created_at = date('Y-m-d H:i:s');

                        if (!$modelConsequencia->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECR3 - Erro ao salvar a consequência do risco, motivo: " . json_encode($modelConsequencia->getErrors()));
                        }
                    }
                }

                if ($valid) {


                    RiscoProbabilidadeTaxaSubstituicao::updateAll(
                        ['status' => RiscoProbabilidadeTaxaSubstituicao::INATIVO],
                        [
                            'and',
                            ['=', 'risco_id', $model->id],
                            ['!=', 'id', $taxaProbabilidade->id],
                        ]
                    );

                    $taxaProbabilidade->risco_id = $model->id;
                    $taxaProbabilidade->status = RiscoProbabilidadeTaxaSubstituicao::ATIVO;
                    $taxaProbabilidade->created_by = \Yii::$app->user->identity->id ?? null;
                    $taxaProbabilidade->created_at = date('Y-m-d H:i:s');

                    if (!$taxaProbabilidade->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR4 - Erro ao salvar a taxa de substituição do risco, motivo: " . json_encode($taxaProbabilidade->getErrors()));
                    }
                }

                if ($valid) {

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

                    foreach ($_POST['RiscoProbabilidadeHistoricoProprio']['ec'] as $key => $historicoProprioItem) {

                        $modelHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
                        $modelHistoricoProprio->risco_id = $model->id;
                        $modelHistoricoProprio->ec = $historicoProprioItem;
                        $modelHistoricoProprio->nr = $_POST['RiscoProbabilidadeHistoricoProprio']['eo'][$key];
                        $modelHistoricoProprio->descritor = $_POST['RiscoProbabilidadeHistoricoProprio']['descritor'][$key];

                        $status = RiscoProbabilidadeHistoricoProprio::ATIVO;
                        if (
                            isset($_POST['RiscoProbabilidadeHistoricoProprio']['selecionado'][$key]) && $_POST['RiscoProbabilidadeHistoricoProprio']['selecionado'][$key] == 1
                        ) {
                            $status = RiscoProbabilidadeHistoricoProprio::SELECIONADO;
                        }

                        $modelHistoricoProprio->status = $status;
                        $modelHistoricoProprio->created_by = \Yii::$app->user->identity->id ?? null;
                        $modelHistoricoProprio->created_at = date('Y-m-d H:i:s');

                        if (!$modelHistoricoProprio->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECR5 - Erro ao salvar a probabilidade do histórico próprio do risco, motivo: " . json_encode($modelHistoricoProprio->getErrors()));
                        }
                    }
                }

                if ($valid) {

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

                    foreach ($_POST['RiscoProbabilidadeContextoSimilar']['ec'] as $key => $contextoSimilarItem) {

                        $modelContextoSimilar = new RiscoProbabilidadeContextoSimilar();
                        $modelContextoSimilar->risco_id = $model->id;
                        $modelContextoSimilar->ec = $contextoSimilarItem;
                        $modelContextoSimilar->nr = $_POST['RiscoProbabilidadeContextoSimilar']['eo'][$key];
                        $modelContextoSimilar->descritor = $_POST['RiscoProbabilidadeContextoSimilar']['descritor'][$key];

                        $status = RiscoProbabilidadeContextoSimilar::ATIVO;
                        if (
                            isset($_POST['RiscoProbabilidadeContextoSimilar']['selecionado'][$key]) && $_POST['RiscoProbabilidadeContextoSimilar']['selecionado'][$key] == 1
                        ) {
                            $status = RiscoProbabilidadeContextoSimilar::SELECIONADO;
                        }

                        $modelContextoSimilar->status = $status;
                        $modelContextoSimilar->created_by = \Yii::$app->user->identity->id ?? null;
                        $modelContextoSimilar->created_at = date('Y-m-d H:i:s');

                        if (!$modelContextoSimilar->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECR6 - Erro ao salvar a probabilidade do contexto similar do risco, motivo: " . json_encode($modelContextoSimilar->getErrors()));
                        }
                    }
                }

                //                if ($valid) {
                //                    $itensVerticalExcluir = RiscoVertical::find()
                //                            ->where([
                //                                'risco_id' => $model->id
                //                            ])
                //                            ->andWhere(['!=', 'chave', $model->chave])
                //                            ->all();
                //                    foreach ($itensVerticalExcluir as $itemExcluir) {
                //                        if (!$itemExcluir->delete()) {
                //                            $valid = false;
                //                            \Yii::$app->session->setFlash('error', "ECR9 - Erro ao excluir o item da vertical de risco, motivo: " . json_encode($itemExcluir->getErrors()));
                //                        }
                //                    }
                //                }
                //
                //                if ($valid) {
                //                    $itensVertical = RiscoVertical::find()
                //                            ->where(['chave' => $model->chave])
                //                            ->all();
                //                    
                //                    foreach ($itensVertical as $item) {
                //                        $item->risco_id = $model->id;
                //                        if (!$item->save()) {
                //                            $valid = false;
                //                            \Yii::$app->session->setFlash('error', "ECR8 - Erro ao salvar o item da vertical de risco, motivo: " . json_encode($item->getErrors()));
                //                        }
                //                    }
                //                }

                if ($valid) {
                    $geraPontuacao = $model->getGeraPontuacaoAnalise();
                    if (!$geraPontuacao) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR10 - Erro ao gerar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage());
                    }
                }

                if ($valid) {
                    $model->pendencia = $model->getPendencia();
                    if (!$model->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR7 - Erro ao salvar a pendência do risco, motivo: " . json_encode($model->getErrors()));
                    }
                }

                if ($valid) {
                    $geraProbabilidade = $model->getGeraProbabilidade();
                    if (!$geraProbabilidade) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR11 - Erro ao gerar a probabilidade do risco, motivo: " . $geraProbabilidade->getMessage());
                    }
                }

                if ($valid) {
                    $geraPontuacaoRisco = $model->getGeraPontuacao();
                    if (!$geraPontuacaoRisco) {
                        $valid = false;
                    }
                }

                if ($valid) {
                    $cenarioRisco->pontuacao = RiscoCenario::geraPontuacao($cenarioRisco);
                    if (!$cenarioRisco->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECR13 - Erro ao gerar a pontuacao do cenário, motivo: " . $cenarioRisco->getMessage());
                    }
                }

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

                    // painel do contexto salva via AJAX (update-risco-contexto.php): responde JSON em vez de redirecionar
                    if ($origem == 'contexto' && Yii::$app->request->isAjax) {
                        Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                        return ['status' => 'success', 'message' => 'Risco atualizado com sucesso'];
                    }

                    // return: sem ele a action seguia e renderizava a pagina inteira dentro do 302
                    if ($origem == 'view') {
                        return $this->redirect(['view', 'id' => $model->risco_cenario_id]);
                    }
                    if ($origem == 'analise') {
                        return $this->redirect(['analise', 'id' => $model->risco_cenario_id]);
                    }
                    if ($origem == 'contexto') {
                        return $this->redirect(['/performance/contexto/view', 'id' => $model->riscoCenario->coletaVinculo->contexto_id, 'aplicacao_id' => $aplicacao]);
                    }
                } else {
                    $transaction->rollback();
                }
            } catch (Exception $ex) {

                $transaction->rollback();
            }
        }

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

        if ($layout == 'contexto') {

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

            if (!$contexto) {
                throw new HttpException(500, "Cliente não encontrado");
            }
            $aplicacao = \app\modules\performance\models\Aplicacao::findOne($aplicacao);

            if (!$aplicacao) {
                throw new HttpException(500, "Aplicação não encontrada");
            }

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

            $totalNotificacoes = count($tarefasAtrasadas);

            $permiteEditar = true;

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

            \app\models\Base::loga("Acessou a atualização de Risco do Cenário via Contexto", $_GET, $_POST, 2);

            return $this->render('update-risco-contexto', [
                'model' => $model,
                'naturezas' => $naturezas,
                'consequencias' => $consequencias,
                'taxaProbabilidade' => $taxaProbabilidade,
                'historicoProprios' => $historicoProprios,
                'contextoSimiliares' => $contextoSimiliares,
                'cenarioRisco' => $cenarioRisco,
                'contexto' => $contexto,
                'aplicacao' => $aplicacao,
                'totalNotificacoes' => $totalNotificacoes,
                'permiteEditar' => $permiteEditar,
                'ultimasAtualizacoes' => $ultimasAtualizacoes,
            ]);
        }

        \app\models\Base::loga("Acessou a atualização de Risco do Cenário", $_GET, $_POST, 2);

        return $this->render('update-risco', [
            'model' => $model,
            'naturezas' => $naturezas,
            'consequencias' => $consequencias,
            'taxaProbabilidade' => $taxaProbabilidade,
            'historicoProprios' => $historicoProprios,
            'contextoSimiliares' => $contextoSimiliares,
            'cenarioRisco' => $cenarioRisco,
        ]);
    }

    public function actionDeleteRisco($id, $origem = 'analise', $aplicacao = null)
    {

        \app\models\Base::loga("Excluiu de Risco do Cenário", $_GET, $_POST, 2);

        $risco = Risco::findOne($id);

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

        if ($risco->riscoCenario->coletaVinculo->contexto->tipoLicenca != 'Licenciado') {
            throw new HttpException(500, 'Cliente não Licenciado');
        }

        $risco->status = Risco::INATIVO;

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

        \Yii::$app->session->setFlash('success', 'Risco excluído com sucesso');


        if ($origem == 'view') {
            $this->redirect(['view', 'id' => $risco->risco_cenario_id]);
        }
        if ($origem == 'analise') {
            $this->redirect(['analise', 'id' => $risco->risco_cenario_id]);
        }

        if ($origem == 'contexto') {
            $this->redirect(['/performance/contexto/view', 'id' => $risco->riscoCenario->coletaVinculo->contexto_id, 'aplicacao_id' => $aplicacao]);
        }
    }

    public function actionRecuperaVertical()
    {

        \app\models\Base::loga("Acessou a recuperação de vertical no cenário", $_GET, $_POST, 2);

        if (!($_POST['vertical'] ?? null)) {
            throw new HttpException(500, "Erro: falta vertical");
        }

        if (!($_POST['chave'] ?? null)) {
            throw new HttpException(500, "Erro: falta chave");
        }

        $chave = $_POST['chave'] ?? null;

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

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

        $dados = [];

        $estruturas = json_decode(Vertical::estruturaRisco($model));

        foreach ($estruturas as $estrutura) {

            $riscoVertical = new RiscoVertical();
            $riscoVertical->chave = $chave;
            $riscoVertical->parent = $estrutura->id;
            $riscoVertical->parent_id = $estrutura->parent;
            $riscoVertical->texto = $estrutura->text;
            $riscoVertical->tipo = $estrutura->data->tipo;
            $riscoVertical->taxa_substituicao = $estrutura->data->taxa_substituicao;
            $riscoVertical->created_by = \Yii::$app->user->identity->id ?? null;
            $riscoVertical->created_at = date('Y-m-d H:i:s');
            $riscoVertical->status = RiscoVertical::ATIVO;


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

            $icone = true;
            if ($estrutura->data->tipo == 'alternativa') {
                $icone = false;
            }
            if ($estrutura->data->tipo == 'indicador') {
                $icone = 'fas fa-sort-numeric-down';
            }

            $dados[] = [
                'id' => $estrutura->id . '||' . $chave,
                'parent' => $estrutura->data->tipo == 'vertice' ? '#' : $estrutura->parent . '||' . $chave,
                'text' => $estrutura->data->tipo == 'alternativa' ? " " . $estrutura->text : '(' . $estrutura->data->taxa_substituicao . '%) ' . $estrutura->text,
                'icon' => $icone,
                'a_attr' => [
                    'class' => 'no_checkbox',
                    'href' => 'javascript:void(0)',
                ],
                'data' => [
                    'id_real' => $estrutura->data->id_real,
                    'tipo' => $estrutura->data->tipo,
                    'taxa_substituicao' => $estrutura->data->taxa_substituicao,
                ],
            ];
        }
        //Utils::debug($dados);
        return json_encode($dados);
    }

    public function actionRecuperaVerticalRisco()
    {

        \app\models\Base::loga("Acessou a recuperação de vertical de risco no cenário", $_GET, $_POST, 2);

        if (!($_POST['chave'] ?? null)) {
            throw new HttpException(500, "Erro: falta chave");
        }

        $chave = $_POST['chave'] ?? null;
        $risco = $_POST['risco'] ?? null;

        $dados = [];

        $estruturas = RiscoVertical::find()
            ->where([
                // $risco e o model Risco quando veio por POST: passar o objeto gerava IN com todos os seus atributos
                'risco_id' => is_object($risco) ? $risco->id : $risco,
                'status' => RiscoVertical::ATIVO,
                //    'chave' => $chave,
            ])
            ->orderBy(['id' => SORT_ASC])
            ->all();

        $vistos = [];
        foreach ($estruturas as $estrutura) {

            // nos repetidos (vertical copiada varias vezes para o mesmo risco) geram ids duplicados
            // e travam o jstree (RangeError / Out of Memory no navegador): envia cada no uma unica vez
            if (isset($vistos[$estrutura->parent])) {
                continue;
            }
            $vistos[$estrutura->parent] = true;

            $icone = true;
            if ($estrutura->tipo == 'alternativa') {
                $icone = false;
            }
            if ($estrutura->tipo == 'indicador') {
                $icone = 'fas fa-sort-numeric-down';
            }

            $dados[] = [
                'id' => $estrutura->parent . '||' . $chave,
                'parent' => $estrutura->tipo == 'vertice' ? '#' : $estrutura->parent_id . '||' . $chave,
                'text' => $estrutura->tipo == 'alternativa' ? " " . $estrutura->texto : '(' . $estrutura->taxa_substituicao . '%) ' . $estrutura->texto,
                'icon' => $icone,
                'a_attr' => [
                    'class' => 'no_checkbox',
                    'href' => 'javascript:void(0)',
                ],
                'data' => [
                    'id_real' => $estrutura->parent . '||' . $chave,
                    'tipo' => $estrutura->tipo,
                    'taxa_substituicao' => $estrutura->taxa_substituicao,
                ],
            ];
        }
        //Utils::debug($dados);
        return json_encode($dados);
    }

    public function actionRecuperaVerticalRiscoPvf($chave, $risco)
    {


        $dados = [];

        $vertice = RiscoVertical::find()
            ->where([
                'chave' => $chave,
                'risco_id' => $risco,
                'tipo' => 'vertice',
            ])
            ->one();

        $estruturas = RiscoVertical::find()
            ->where([
                'chave' => $chave,
                'parent_id' => $vertice->parent ?? null,
                'risco_id' => $risco,
                'status' => RiscoVertical::ATIVO,
            ])
            ->all();

        foreach ($estruturas as $estrutura) {

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

            $dados[] = [
                'id' => $estrutura->id,
                'text' => $tx . $estrutura->texto,
                'chave' => $estrutura->chave,
                'children' => true,
            ];
        }
        // Utils::debug([$vertice, $dados]);
        return json_encode($dados);
    }

    public function actionRecuperaVerticalRiscoFilho($id)
    {

        $dados = [];

        $item = RiscoVertical::findOne($id);

        $estruturas = RiscoVertical::find()
            ->where([
                'chave' => $item->chave,
                'parent_id' => $item->parent,
                'risco_id' => $item->risco_id,
                'status' => RiscoVertical::ATIVO,
            ])
            ->all();


        foreach ($estruturas as $estrutura) {

            $icone = true;

            $children = true;

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

            if ($estrutura->tipo == 'alternativa') {
                $icone = false;
                $children = false;
                $tx = '';
            }
            if ($estrutura->tipo == 'indicador') {
                $icone = 'fas fa-sort-numeric-down';
            }

            $dados[] = [
                'id' => $estrutura->id,
                'text' => $tx . $estrutura->texto,
                'chave' => $estrutura->chave,
                'icon' => $icone,
                'children' => $children,
            ];
            //            $dados[] = [
            //                'id' => $estrutura->parent . '||' . $chave,
            //                'parent' => $estrutura->tipo == 'vertice' ? '#' : $estrutura->parent_id . '||' . $chave,
            //                'text' => '(' . $estrutura->taxa_substituicao . '%) ' . $estrutura->texto,
            //                'a_attr' => [
            //                    'class' => 'no_checkbox',
            //                    'href' => 'javascript:void(0)',
            //                ],
            //                'data' => [
            //                    'id_real' => $estrutura->parent . '||' . $chave,
            //                    'tipo' => $estrutura->tipo,
            //                    'taxa_substituicao' => $estrutura->taxa_substituicao,
            //                ],
            //            ];
        }
        // Utils::debug([$vertice, $dados]);
        return json_encode($dados);
    }

    public function actionRecuperaVerticalChave()
    {

        if (($_POST['chave'] ?? null) === null) {
            throw new HttpException(500, "Erro: falta chave");
        }
        $chave = $_POST['chave'] ?? null;
        //$risco = $_POST['risco'];

        $dados = [];

        $estruturas = RiscoVertical::find()
            ->where([
                // 'risco_modelo_risco_id' => $risco,
                'status' => RiscoVertical::ATIVO,
                'chave' => $chave,
            ])
            //->andWhere(['>', 'taxa_substituicao', 0])
            ->all();


        foreach ($estruturas as $estrutura) {

            //$validaTaxaSubstituicao = RiscoModeloRiscoVertical::validaSomaTaxaSubstiuicao($estrutura);

            $icone = true;
            if ($estrutura->tipo == 'alternativa') {
                $icone = false;
            }
            if ($estrutura->tipo == 'indicador') {
                $icone = 'fas fa-sort-numeric-down';
            }

            $dados[] = [
                'id' => $estrutura->parent . '||' . $estrutura->chave,
                'parent' => $estrutura->tipo == 'vertice' ? '#' : $estrutura->parent_id . '||' . $estrutura->chave,
                'text' => $estrutura->tipo == 'alternativa' ? " " . $estrutura->texto : '(' . $estrutura->taxa_substituicao . '%) ' . $estrutura->texto,
                'icon' => $icone,
                //'text' => '(' . $estrutura->taxa_substituicao . '%) ' . $estrutura->texto,
                //'text' => $validaTaxaSubstituicao . ' - ' . $estrutura->taxa_substituicao . ' - ' . $estrutura->texto,
                'a_attr' => [
                    'class' => 'no_checkbox',
                    'href' => 'javascript:void(0)',
                ],
                'data' => [
                    'id_real' => $estrutura->parent . '||' . $estrutura->chave,
                    'tipo' => $estrutura->tipo,
                    'taxa_substituicao' => $estrutura->taxa_substituicao,
                ],
            ];
        }
        //Utils::debug($dados);
        return json_encode($dados);
    }

    public function actionVerticalExcluiItem()
    {

        \app\models\Base::loga("Excluu item da vertical do Risco em cenário", $_GET, $_POST, 2);

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

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

        $transaction = $connection->beginTransaction();

        $valid = true;
        try {
            if (isset($_POST['id'])) {

                $id = $_POST['id'];

                $exp = explode("||", $id);

                if (!isset($exp[1])) {
                    $valid = false;
                    $msg = "Erro no formato do item " . $id;
                }

                if ($valid) {
                    $item = RiscoVertical::find()
                        ->where([
                            'parent' => $exp[0],
                            'chave' => $exp[1]
                        ])
                        ->one();

                    if (!$item) {
                        $valid = false;
                        $msg = "Erro: item não encontrado";
                    }
                }

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

            if ($valid) {
                if (isset($_POST['filhos'])) {

                    foreach ($_POST['filhos'] as $filho) {
                        if ($valid) {
                            $exp = explode("||", $filho);

                            if (!isset($exp[1])) {
                                $valid = false;
                                $msg = "Erro no formato do item (filho) " . $id;
                            }

                            if ($valid) {
                                $item = RiscoVertical::find()
                                    ->where([
                                        'parent' => $exp[0],
                                        'chave' => $exp[1]
                                    ])
                                    ->one();
                            }
                            if (!$item) {
                                $valid = false;
                                $msg = "Erro: item (filho) não encontrado";
                            }

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

            if ($valid) {
                $transaction->commit();
                return 1;
            } else {
                $transaction->rollback();
                return $msg;
            }
        } catch (Exception $ex) {

            $transaction->rollback();

            return $ex->getMessage();
        }
    }

    public function actionVerticalAtualizaItem()
    {

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

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

        $node = $post['RiscoVertical']['node'];

        $risco = $post['RiscoVertical']['risco'];

        $exp = explode("||", $node);
        $model = RiscoVertical::find()
            ->where([
                'parent' => $exp[0],
                'chave' => $exp[1],
                'risco_id' => $risco,
            ])
            ->one();

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

            \app\models\Base::loga("Atualizou item da vertical de Risco no cenário", $_GET, $_POST, 2);

            $transaction = \Yii::$app->db->beginTransaction();
            try {
                if ($model->validate()) {
                    $flag = $model->save(false);
                    if ($flag == true) {
                        $transaction->commit();
                        return Json::encode(array('status' => 'success', 'type' => 'success', 'message' => 'Item salvo com sucesso.'));
                    } else {
                        $transaction->rollBack();
                        return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => Json::encode($model->getErrors)));
                    }
                } else {
                    return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => Json::encode($model->getErrors)));
                }
            } catch (Exception $ex) {
                $transaction->rollBack();
            }
        }

        \app\models\Base::loga("Acessou a atualização de item da vertical de Risco no cenário", $_GET, $_POST, 2);

        return $this->renderAjax('_vertical_atualizar_item', [
            'model' => $model,
        ]);
    }

    public function actionAnalise($id)
    {

        \app\models\Base::loga("Acessou a análise do Risco em cenário", $_GET, $_POST, 2);

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

        $riscosCategorias = RiscoModelo::riscoCategoria($model->riscoModelo);

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

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

        $riscosGrafico = [];
        $riscosHeat = [];

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

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

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

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

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

        foreach ($cenarios as $cenario) {


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

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

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

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

            foreach ($riscos as $risco) {

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

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

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

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


                if ($pontuacaoRisco <= 25) {
                    $corRisco = $coresPadrao[0];
                } elseif ($pontuacaoRisco <= 50) {
                    $corRisco = $coresPadrao[1];
                } elseif ($pontuacaoRisco <= 75) {
                    $corRisco = $coresPadrao[2];
                } else {
                    $corRisco = $coresPadrao[3];
                }

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

                $r++;
            }

            $todosCenariosDrilldrown[] = [
                'id' => 'd' . $cenario->id,
                'name' => $cenario->nome,
                'data' => $dataRisco,
            ];

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

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

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

        $todosCenarios = array_reverse($todosCenarios, true);
        if (isset($_GET['dados'])) {
            Utils::debug(${$_GET['dados']});
        }

        $jsQuadrantes = '';

        $myClientesGestor = GenericSearch::filterMyClientesRiskGestor()
            ->query
            ->column();

        $permiteCriarAtualizarExcluir = in_array($model->coletaVinculo->contexto->cliente_id, $myClientesGestor);

        return $this->render('analise', [
            'model' => $model,
            'origem' => 'analise',
            'botoes' => $permiteCriarAtualizarExcluir,
            'avisaPendencia' => $permiteCriarAtualizarExcluir,
            'grafico' => true,
            'todosCenarios' => $todosCenarios,
            'todosCenariosPontuacao' => $todosCenariosPontuacao,
            'todosRiscos' => $todosRiscos,
            'maxPontuacaoRisco' => $maxPontuacaoRisco,
            'riscosCategorias' => $riscosCategorias,
            'parametrosLabel' => $parametrosLabel,
            'contexto' => $contexto,
            'cores' => $cores,
            'coresPadrao' => $coresPadrao,
            'todosCenariosDrilldrown' => $todosCenariosDrilldrown,
        ]);
    }
}
