<?php

namespace app\modules\performance\controllers;

use Yii;
use app\modules\performance\models\Cliente;
use app\modules\performance\models\ClienteSearch;
use app\modules\performance\models\ClienteTemUsuario;
use app\modules\performance\models\Contexto;
use app\modules\performance\models\ContextoSearch;
use app\modules\performance\models\Coleta;
use app\modules\performance\models\ClienteTemParametro;
use app\modules\performance\models\ClienteTemVertical;
use app\modules\performance\models\ClienteTemVerticalSearch;
use app\modules\performance\models\ClienteTemServico;
use app\modules\performance\models\Vertical;
use app\modules\performance\models\VerticalSearch;
use app\modules\performance\models\Projeto;
use app\modules\performance\models\ProjetoTemVertical;
use app\modules\performance\models\ClienteTemTimelineTipo;
use app\modules\performance\models\TimelineTipo;
use app\modules\performance\models\TimelineTipoSearch;
use app\modules\performance\models\ClienteTemDocs;
use app\modules\performance\models\ClienteTemFaixa;
use app\modules\performance\models\UnidadeNegocio;
use app\modules\performance\models\Aplicacao;
use app\modules\performance\models\AplicacaoSearch;
use app\controllers\BaseController;
use app\models\Municipio;
use app\models\Scope;
use app\components\Utils;
use app\components\Logged;
use app\models\EmailTemplate;
use app\models\Estado;
use app\models\GenericSearch;
use app\models\Wildcard;
use app\modules\operational\models\Ocorrencia;
use app\modules\performance\models\ClienteTemModulo;
use Exception;
use NumberFormatter;
use yii\web\HttpException;
use yii\web\NotFoundHttpException;
use yii\web\UploadedFile;
use yii\helpers\ArrayHelper;
use yii\helpers\Json;
use yii\filters\VerbFilter;

/**
 * ClienteController implements the CRUD actions for Cliente model.
 */
class ClienteController extends \app\controllers\BaseController
{

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

    public function actions()
    {
        return [
            'addressSearch' => 'yiibr\correios\CepAction'
        ];
    }

    /*
     * CEON
     */

    public function actionMulti()
    {

        $this->redirect('index')->send();
        \app\models\Base::loga("Acessou a visualização de multi Cliente", $_GET, $_POST, 28);

        if (Logged::isCeon()) {
            $clientes = Cliente::find()
                ->where([
                    'cliente.status' => Cliente::ATIVO,
                ])
                ->orderBy('nome ASC')
                ->all();
        } else {
            $clientes = Cliente::find()
                ->join('LEFT JOIN', 'user_has_resource', 'user_has_resource.resource_id=cliente.id')
                ->where([
                    'cliente.status' => Cliente::ATIVO,
                    'user_has_resource.user_id' => \Yii::$app->user->identity->id,
                    'user_has_resource.role' => \app\models\UserHasResource::NV_CP_CLIENTE_ADM,
                ])
                ->orderBy('nome ASC')
                ->all();
        }
        return $this->render('multi', [
            'clientes' => $clientes,
        ]);
    }

    public function actionDetail($id)
    {

        \app\models\Base::loga("Acessou a visualização dos detalhes do Cliente", $_GET, $_POST, 29);

        $cliente = Cliente::findOne(['id' => $id, 'status' => Cliente::ATIVO]);

        if (!$cliente) {
            throw new HttpException(500, "Erro! Cliente não encontrado ou excluído");
        }

        $aplicacaoPrincipals = Aplicacao::find()
            ->joinWith('unidadeNegocio')
            ->where([
                'unidade_negocio.cliente_id' => $cliente->id,
                'aplicacao.importancia' => Aplicacao::IMPORTANCIA_PRINCIPAL,
                'aplicacao.status' => Aplicacao::ATIVO,
            ])
            ->orderBy('ordem ASC, id ASC')
            ->all();

        if (count($aplicacaoPrincipals) == 1) {
            $this->redirect([$aplicacaoPrincipals[0]->rota, 'id' => $aplicacaoPrincipals[0]->id]);
        } else {

            $parametrosLabel = ArrayHelper::map(ClienteTemParametro::find()
                ->where([
                    'tipo' => ClienteTemParametro::LABEL,
                    'cliente_id' => $cliente->id,
                    'status' => ClienteTemParametro::ATIVO
                ])
                ->all(), 'parametro', 'valor');

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

            $evolucao = Cliente::evolucao($cliente);

            return $this->render('detail', [
                'cliente' => $cliente,
                'valorGlobalIcone' => $valorGlobalIcone,
                'evolucao' => $evolucao,
                'aplicacaoPrincipals' => $aplicacaoPrincipals,
                'parametrosLabel' => $parametrosLabel,
            ]);
        }
    }


    //////////////////////////// old

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

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

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

        $contextos =  Contexto::find()
            ->andWhere('rgt-lft=1')
            ->andWhere('active=1')
            ->all();

        $ocorrenciasTotal = Yii::$app->cache->getOrSet('dashboard-cliente-ocorrencias-total-v1', function () {
            return (int) Ocorrencia::find()
                ->where([
                    'co_ocorrencia.isDeleted' => Ocorrencia::NAO_EXCLUIDA,
                ])
                ->count();
        }, 60);

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

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

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

        \app\models\Base::loga("Acessou o Cliente", $_GET, $_POST, 31);

        $model = $this->findModel($id);
        // Utils::debug($model->id, false);

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

        $aplicacao = Aplicacao::find()
            ->join('LEFT JOIN', 'unidade_negocio', 'unidade_negocio.id=aplicacao.unidade_negocio_id')
            ->join('LEFT JOIN', 'cliente', 'cliente.id=unidade_negocio.cliente_id')
            ->where([
                'cliente.id' => $model->id,
                'cliente.status' => Cliente::ATIVO,
                'aplicacao.status' => Aplicacao::ATIVO,
                'unidade_negocio.status' => UnidadeNegocio::ATIVO,
            ])
            ->one();

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

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

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

        $searchModel->aplicacaoProjetos = $projetos;

        $filters = [];

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

        if (isset(Yii::$app->request->queryParams['ContextoSearch'])) {
            $contextoSearch = Yii::$app->request->queryParams['ContextoSearch'];
        } else {
            $contextoSearch =
                [
                    'name' => '',
                    'lgpdAdvogado' => '',
                    'lgpdFase' => '',
                    'risco' => '',
                    'active' => '',
                    'pontuacao' => '',
                    'lgpdVisualizador' => '',
                ];
        }

        $searchModelResponsavel = new \app\models\UserSearch();

        if ($searchModelResponsavel->status == "") {
            $searchModelResponsavel->status = \app\models\User::STATUS_ACTIVE;
        }

        $paramsResponsavel = [];
        $paramsResponsavel['cliente_id'] = $model->id;
        $paramsResponsavel = array_merge($paramsResponsavel, Yii::$app->request->queryParams);

        $dataProviderResponsavel = $searchModelResponsavel->searchResponsavel($paramsResponsavel);

        if ($estado_id && $estado_id != 'todas') {

            $listaMunicipiosA = Municipio::find()
                ->select('id')
                ->where([
                    'estado_id' => $estado_id,
                ])
                ->column();

            $listaC = Contexto::find()
                ->select('id')
                ->where([
                    'municipio_id' => $listaMunicipiosA,
                    'active' => 1,
                ])
                ->column();


            $contextos = $dataProvider
                ->query
                ->andWhere(['in', 'contexto.id', $listaC])
                ->orderBy('id DESC')->all();
        } else {

            $contextos = $dataProvider->query->orderBy('id DESC')->all();
        }

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

        $licencasValor = 0;

        $licencas = \app\models\Licenca::find()
            ->select(new \yii\db\Expression("sum(valor) as total, CONCAT(MONTH(criado_em), '/', YEAR(criado_em)) AS mesano"))
            ->where(['status' => \app\models\Licenca::LIBERADO])
            ->andWhere(['in', 'contexto_id', $listaContextos])
            ->groupBy('month(criado_em), year(criado_em)')
            ->all();

        $licencasMes = [];
        $licencasMesValor = [];
        $licencasTotalValor = 0;
        foreach ($licencas as $licenca) {
            $licencasMes[] = $licenca['mesano'];
            $licencasMesValor[] = floatval($licenca['total']);
            $licencasTotalValor += $licenca['total'];
        }

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

            */

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

        $advogados = \app\models\User::find()
            ->select(new \yii\db\Expression("user_ceon.name AS 'name', user_ceon.id AS 'id', count(user_has_resource.resource_id) AS 'total'"))
            ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
            ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
            ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
            ->where([
                'user_has_resource.role' => \app\models\UserHasResource::NV_CP_CONTEXTO_ADM,
                //    'profile.cliente_id' => $model->unidadeNegocio->cliente_id,
                'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
                'contexto.cliente_id' => $model->id,
                'contexto.active' => Contexto::ATIVO,
            ])
            ->andWhere(['!=', 'contexto.id', Contexto::ID_VIA_LGPD])
            ->asArray()
            ->orderBy('total DESC')
            ->groupBy('user_ceon.id')
            ->all();

        $dadosAdvogados = [];
        foreach ($advogados as $advogado) {

            $dadosAdvogados[$advogado['id']] = [
                'label' => $advogado['name'],
                'value' => $advogado['total'],
            ];
        }


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

        $contextosId = [];
        foreach ($contextosCliente as $contextoCliente) {
            $contextosId[] = $contextoCliente->id;
        }

        $ultimasColetasContexto = \app\modules\performance\models\Coleta::find()
            ->select(new \yii\db\Expression("max(id) AS 'id'"))
            ->where(['status' => \app\modules\performance\models\Coleta::ATIVO])
            ->andWhere(['in', 'contexto_id', $contextosId])
            ->groupBy('contexto_id')
            ->column();

        //        $fasesConformidade = \app\modules\performance\models\ColetaAlternativa::find()
        //                ->select(new \yii\db\Expression("count(coleta_alternativa.id) as 'temp', coleta_alternativa.nome as 'nome'"))
        //                ->join('LEFT JOIN', 'coleta_indicador', 'coleta_indicador.id=coleta_alternativa.indicador_id')
        //                ->join('LEFT JOIN', 'coleta_estrutura', 'coleta_estrutura.id = coleta_indicador.estrutura_id')
        //                ->join('LEFT JOIN', 'coleta', 'coleta.id = coleta_estrutura.coleta_id')
        //                ->join('LEFT JOIN', 'contexto', 'contexto.id = coleta.contexto_id')
        //                ->join('LEFT JOIN', 'cliente', 'cliente.id = contexto.cliente_id')
        //                ->where([
        //                    'coleta_alternativa.selecionado' => \app\modules\performance\models\ColetaAlternativa::ATIVO,
        //                ])
        //                ->andWhere(['in', 'coleta.id', $ultimasColetasContexto])
        //                ->andWhere(['in', 'coleta_indicador.vertical_indicador_id', [
        //                        \app\modules\performance\models\VerticalIndicador::LGPD_INDICADOR_FASE,
        //                        \app\modules\performance\models\VerticalIndicador::LGPD_INDICADOR_FASE_MODELO_420,
        //                        \app\modules\performance\models\VerticalIndicador::LGPD_INDICADOR_FASE_MODELO_420_OUTRO,
        //                    ],
        //                ])
        //                ->asArray()
        //                ->orderBy('temp DESC')
        //                ->groupBy('coleta_alternativa.nome')
        //                ->all();
        //
        //        $fases = [];
        //        foreach ($fasesConformidade as $faseConformidade) {
        //            $fases[] = [
        //                'label' => $faseConformidade['nome'],
        //                'value' => $faseConformidade['temp'],
        //            ];
        //        }

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

        $inventarioRespostasDados = [];
        foreach ($inventarioRespostas as $inventarioResposta) {
            $inventarioRespostasDados[$inventarioResposta->scope->contexto_id] = $inventarioResposta->alternativas_radiobox;
        }

        $inventarioRespostasDadosAjuste = [];
        foreach ($inventarioRespostasDados as $k => $v) {

            if (!isset($inventarioRespostasDadosAjuste[$v])) {
                $total = 1;
            } else {
                $total = $inventarioRespostasDadosAjuste[$v] + 1;
            }

            $inventarioRespostasDadosAjuste[$v] = $total;
        }

        $fases = [];
        foreach ($inventarioRespostasDadosAjuste as $a => $b) {
            $fases[] = [
                'label' => $a,
                'value' => $b,
            ];
        }

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

        $riscoCenarios = $riscoCenarios
            ->orderBy('risco_cenario.id DESC')
            ->asArray()
            ->all();


        $riscos = [];
        $cenariosExiste = [];
        $riscoBaixo = 0;
        $riscoModerado = 0;
        $riscoAlto = 0;
        $riscoCritico = 0;

        foreach ($riscoCenarios as $riscoCenario) {

            if (!in_array($riscoCenario['contextoid'], $cenariosExiste)) {
                if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
                    $riscoBaixo++;
                } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
                    $riscoModerado++;
                } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
                    $riscoAlto++;
                } else {
                    $riscoCritico++;
                }
            }
            $cenariosExiste[] = $riscoCenario['contextoid'];
        }

        $riscos[] = ['label' => 'Baixo', 'value' => $riscoBaixo];
        $riscos[] = ['label' => 'Moderado', 'value' => $riscoModerado];
        $riscos[] = ['label' => 'Alto', 'value' => $riscoAlto];
        $riscos[] = ['label' => 'Crítico', 'value' => $riscoCritico];

        $searchModelAdvogados = new \app\models\UserSearch();

        if ($searchModelAdvogados->status == "") {
            $searchModelAdvogados->status = \app\models\User::STATUS_ACTIVE;
        }

        $params = [];
        $params['cliente_id'] = $model->id;
        $params = array_merge($params, Yii::$app->request->queryParams);

        $dataProviderAdvogados = $searchModelAdvogados->searchEscritorio($params);

        $searchModelVertical = new VerticalSearch();
        $queryParamsVertical = array_merge(array(), Yii::$app->request->getQueryParams());
        $queryParamsVertical["VerticalSearch"]["status"] = Vertical::ATIVO;
        $dataProviderVertical = $searchModelVertical->search($queryParamsVertical);
        $dataProviderVertical->pagination->pageSize = 100000;

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

            $valid = true;

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

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

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

                if ($model->logoFile) {
                    $nome = md5(date('Ymd') . $model->nome);

                    $model->logo = $nome . '.' . $model->logoFile->extension;

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

                        $valid = false;
                        throw new HttpException(500, "ECC1 - Erro ao salvar a logo");
                    }
                }

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

                if ($model->pdfImagemFile) {
                    $nome = 'PDF' . md5(date('Ymd') . $model->nome);

                    $model->pdf_imagem = $nome . '.' . $model->pdfImagemFile->extension;

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

                        $valid = false;
                        throw new HttpException(500, "ECC111 - Erro ao salvar a logo do PDF");
                    }
                }

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

                if ($valid) {

                    foreach ($model->clienteTemVerticals as $clienteTemVertical) {
                        if ($valid) {
                            $clienteTemVertical->status = ClienteTemVertical::INATIVO;
                            if (!$clienteTemVertical->save()) {
                                $valid = false;
                                \Yii::$app->session->setFlash('error', "ECC6 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                //throw new HttpException(500, "ECC6 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {

                    if (isset($_POST['Vertical']['selection'])) {
                        $verticaisAtivas = Vertical::find()->select('id')->where(['status' => Vertical::ATIVO])->column();

                        foreach ($_POST['Vertical']['selection'] as $value) {
                            if ($valid) {
                                if (in_array($value, $verticaisAtivas)) {

                                    $clienteTemVertical = new ClienteTemVertical();
                                    $clienteTemVertical->cliente_id = $model->id;
                                    $clienteTemVertical->vertical_id = $value;
                                    $clienteTemVertical->status = Vertical::ATIVO;
                                    $clienteTemVertical->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemVertical->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemVertical->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                        //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                } else {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                    //throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }

                if ($valid) {
                    ClienteTemModulo::deleteAll(['cliente_id' => $model->id]);
                    foreach ($model->modulos as $modulo) {
                        $clienteTemModulo = new ClienteTemModulo();
                        $clienteTemModulo->cliente_id = $model->id;
                        $clienteTemModulo->modulo = $modulo;

                        if (!$clienteTemModulo->save()) {
                            $msgErro = '';
                            $valid = false;
                            foreach ($clienteTemModulo->getErrors() as $key => $value) {
                                foreach ($value as $chave => $erro) {
                                    $msgErro .= $erro . '<br />';
                                }
                            }
                            throw new HttpException(500, $msgErro);
                        }
                    }
                }

                if ($valid) {

                    $transaction->commit();

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

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

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

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


        $params = [];
        $params['cliente_id'] = $model->id;
        $params['contexto_ids'] = $listaContextos;
        $params = array_merge($params, Yii::$app->request->queryParams);

        $searchModelOperadores = new \app\models\UserSearch();

        if ($searchModelOperadores->status == "") {
            $searchModelOperadores->status = \app\models\User::STATUS_ACTIVE;
        }

        $dataProviderOperadores = $searchModelOperadores->searchOperador($params);


        $searchModelSupervisores = new \app\models\UserSearch();

        if ($searchModelSupervisores->status == "") {
            $searchModelSupervisores->status = \app\models\User::STATUS_ACTIVE;
        }

        $dataProviderSupervisores = $searchModelSupervisores->searchSupervisor($params);


        $listaContextos = ArrayHelper::map(Contexto::find()
            ->where('rgt-lft=1')
            ->andwhere([
                'cliente_id' => $model->id,
                'active' => Contexto::ATIVO
            ])
            ->all(), 'id', 'name');

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

        $inventarioRespostasDadosStatusQuos = [];
        foreach ($inventarioRespostasStatusQuos as $inventarioRespostasStatusQuo) {
            $inventarioRespostasDadosStatusQuos[$inventarioRespostasStatusQuo->scope->contexto_id] = $inventarioRespostasStatusQuo->alternativas_radiobox;
        }

        $inventarioRespostasDadosAjusteStatusQuos = [];
        foreach ($inventarioRespostasDadosStatusQuos as $kS => $vS) {

            if (!isset($inventarioRespostasDadosAjusteStatusQuos[$vS])) {
                $totalS = 1;
            } else {
                $totalS = $inventarioRespostasDadosAjusteStatusQuos[$vS] + 1;
            }

            $inventarioRespostasDadosAjusteStatusQuos[$vS] = $totalS;
        }

        $statusQuos = [];
        foreach ($inventarioRespostasDadosAjusteStatusQuos as $aS => $bS) {
            $statusQuos[] = [
                'label' => $aS,
                'value' => $bS,
            ];
        }

        $ocorrenciasTodas = Ocorrencia::find()
            ->where([
                'co_ocorrencia.cliente_id' => $model->id,
                'co_ocorrencia.isDeleted' => Ocorrencia::NAO_EXCLUIDA,
            ])
            ->all();

        $listaMunicipios = Contexto::find()
            ->select('municipio_id')
            ->where([
                'cliente_id' => $model->id,
                'active' => 1,
            ])
            ->column();

        $estados = Estado::find()
            ->join('INNER JOIN', 'municipio', 'estado.id=municipio.estado_id')
            ->where([
                'estado.status' => Estado::ATIVO,
                'municipio.status' => Municipio::ATIVO,
            ])
            ->andWhere(['in', 'municipio.id', $listaMunicipios])
            ->orderBy('nome ASC')
            ->all();

        // Utils::debug($inventarioRespostasDadosAjusteStatusQuos);
        return $this->render('view', [
            'model' => $model,
            'contextos' => $contextos,
            'licencasTotalValor' => $licencasTotalValor,
            'tarefasAtrasadas' => $tarefasAtrasadas,
            'dadosAdvogados' => $dadosAdvogados,
            'fases' => $fases,
            'riscos' => $riscos,
            'licencasMes' => $licencasMes,
            'licencasMesValor' => $licencasMesValor,
            'aplicacao' => $aplicacao,
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'filters' => $filters,
            'searchModelAdvogados' => $searchModelAdvogados,
            'dataProviderAdvogados' => $dataProviderAdvogados,
            'isCeon' => $isCeon,
            'searchModelResponsavel' => $searchModelResponsavel,
            'dataProviderResponsavel' => $dataProviderResponsavel,
            'parametrosLabel' => $parametrosLabel,
            'searchModelOperadores' => $searchModelOperadores,
            'dataProviderOperadores' => $dataProviderOperadores,
            'listaContextos' => $listaContextos,
            'contextoSearch' => $contextoSearch,
            'searchModelVertical' => $searchModelVertical,
            'dataProviderVertical' => $dataProviderVertical,
            //                    'contextoSearch' => $contextoSearch,
            //                    'dataProviderContexto' => $dataProviderContexto,
            //                    'tiposParametros' => $tiposParametros,
            //                    'docs' => $docs,
            //                    'organograma' => $organograma,
            'statusQuos' => $statusQuos,
            'searchModelSupervisores' => $searchModelSupervisores,
            'dataProviderSupervisores' => $dataProviderSupervisores,
            'ocorrenciasTodas' => $ocorrenciasTodas,
            'estados' => $estados,
            'estado_id' => $estado_id ?? 'todas',
        ]);
    }

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

        \app\models\Base::loga("Acessou o cadastro de Cliente", $_GET, $_POST, 32);

        $model = new Cliente();

        $modelParametro = new ClienteTemParametro();

        $modelServico = new ClienteTemServico();

        $modelFaixa = new ClienteTemFaixa();

        $searchModelVertical = new VerticalSearch();
        $queryParamsVertical = array_merge(array(), Yii::$app->request->getQueryParams());
        $queryParamsVertical["VerticalSearch"]["status"] = Vertical::ATIVO;
        $dataProviderVertical = $searchModelVertical->search($queryParamsVertical);
        $dataProviderVertical->pagination->pageSize = 100000;

        $searchModelTimelineTipo = new TimelineTipoSearch();
        $queryParamsTimelineTipo = array_merge(array(), Yii::$app->request->getQueryParams());
        $queryParamsTimelineTipo["TimelineTipoSearch"]["status"] = TimelineTipo::ATIVO;
        $dataProviderTimelineTipo = $searchModelTimelineTipo->search($queryParamsTimelineTipo);
        $dataProviderTimelineTipo->pagination->pageSize = 100000;

        $modelUnidadeNegocio = new UnidadeNegocio();

        $docs = [
            ClienteTemDocs::PARECER_TECNICO => 'Parecer Técnico',
            ClienteTemDocs::RECOMENDACAO_TECNICA => 'Recomendações Técnicas',
            ClienteTemDocs::PLANO_APLICACAO_FULL => 'Plano de Aplicação Full',
            ClienteTemDocs::PLANO_APLICACAO_BASIC => 'Plano de Aplicação Basic',
            ClienteTemDocs::DOCUMENTOS => 'Documentos',
            ClienteTemDocs::FOTOS => 'Fotos',
        ];

        if ($model->load(Yii::$app->request->post())) {
            // Utils::debug(Yii::$app->request->post());
            $valid = true;

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

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

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

                if ($model->logoFile) {
                    $nome = md5(date('Ymd') . $model->nome);

                    $model->logo = $nome . '.' . $model->logoFile->extension;

                    if (!$model->upload()) {
                        $valid = false;
                        // \Yii::$app->session->setFlash('error', "ECC1 - Erro ao salvar a logo");
                        throw new HttpException(500, "ECC1 - Erro ao salvar a logo");
                    }
                }

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

                if ($model->logoFileMiniatura) {
                    $nome = md5(date('Ymd') . $model->nome . 'miniatura');

                    $model->logo_mini = $nome . '.' . $model->logoFileMiniatura->extension;

                    if (!$model->uploadMiniatura()) {
                        $valid = false;
                        // \Yii::$app->session->setFlash('error', "ECC1 - Erro ao salvar a logo miniatura");
                        throw new HttpException(500, "ECC1 - Erro ao salvar a logo");
                    }
                }

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

                if ($model->timbreFileMiniatura) {
                    $nome = md5(date('Ymd') . $model->nome . 'timbre');

                    $model->timbre = $nome . '.' . $model->timbreFileMiniatura->extension;

                    if (!$model->uploadTimbre()) {
                        $valid = false;
                        //\Yii::$app->session->setFlash('error', "ECC1 - Erro ao salvar o timbre");
                        throw new HttpException(500, "ECC1 - Erro ao salvar a logo");
                    }
                }

                if ($valid) {
                    if (!$model->save()) {
                        $valid = false;
                        // \Yii::$app->session->setFlash('error', "ECC2 - Erro ao salvar o cliente, motivo: " . json_encode($model->getErrors()));
                        throw new HttpException(500, "ECC2 - Erro ao salvar o cliente, motivo: " . json_encode($model->getErrors()));
                    }
                }

                if ($valid) {

                    if (isset($_POST['Vertical']['selection'])) {
                        $verticaisAtivas = Vertical::find()->select('id')->where(['status' => Vertical::ATIVO])->column();

                        foreach ($_POST['Vertical']['selection'] as $value) {
                            if ($valid) {
                                if (in_array($value, $verticaisAtivas)) {

                                    $clienteTemVertical = new ClienteTemVertical();
                                    $clienteTemVertical->cliente_id = $model->id;
                                    $clienteTemVertical->vertical_id = $value;
                                    $clienteTemVertical->status = Vertical::ATIVO;
                                    $clienteTemVertical->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemVertical->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemVertical->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                        //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                } else {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                    //throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }

                if ($valid) {

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

                        if (isset($_POST['ClienteTemParametro']['parametro'])) {

                            foreach ($_POST['ClienteTemParametro']['parametro'] as $key => $parametro) {

                                if (!empty($parametro)) {

                                    if (!empty($_POST['ClienteTemParametro']['valor'][$key])) {

                                        $clienteTemParametro = new ClienteTemParametro();
                                        $clienteTemParametro->cliente_id = $model->id;
                                        $clienteTemParametro->tipo = $_POST['ClienteTemParametro']['tipo'][$key];
                                        $clienteTemParametro->parametro = $parametro;
                                        $clienteTemParametro->valor = $_POST['ClienteTemParametro']['valor'][$key];
                                        $clienteTemParametro->status = Vertical::ATIVO;
                                        $clienteTemParametro->created_by = Yii::$app->user->identity->id ?? null;
                                        $clienteTemParametro->created_at = date('Y-m-d H:i:s');

                                        if (!$clienteTemParametro->save()) {
                                            $valid = false;
                                            // \Yii::$app->session->setFlash('error', "ECC5 - Erro ao salvar os parametros, motivo: " . json_encode($clienteTemParametro->getErrors()));
                                            throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if ($valid) {

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

                        foreach ($_POST['ClienteTemFaixa']['de'] as $key => $faixa) {

                            $clienteTemFaixa = new ClienteTemFaixa();
                            $clienteTemFaixa->cliente_id = $model->id;
                            $clienteTemFaixa->de = $_POST['ClienteTemFaixa']['de'][$key];
                            $clienteTemFaixa->ate = $_POST['ClienteTemFaixa']['ate'][$key];
                            $clienteTemFaixa->cor = $_POST['ClienteTemFaixa']['cor'][$key];
                            $clienteTemFaixa->created_by = Yii::$app->user->identity->id ?? null;
                            $clienteTemFaixa->created_at = date('Y-m-d H:i:s');

                            if (!$clienteTemFaixa->save()) {
                                $valid = false;
                                //\Yii::$app->session->setFlash('error', "ECCF - Erro ao salvar as faixas, motivo: " . json_encode($clienteTemFaixa->getErrors()));
                                throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {

                    if (isset($_POST['TimelineTipo']['selection'])) {
                        $timeTiposAtivos = TimelineTipo::find()->select('id')->where(['status' => TimelineTipo::ATIVO])->column();

                        foreach ($_POST['TimelineTipo']['selection'] as $value) {
                            if ($valid) {
                                if (in_array($value, $timeTiposAtivos)) {

                                    $clienteTemTimelineTipo = new ClienteTemTimelineTipo();
                                    $clienteTemTimelineTipo->cliente_id = $model->id;
                                    $clienteTemTimelineTipo->timeline_tipo_id = $value;
                                    $clienteTemTimelineTipo->status = TimelineTipo::ATIVO;
                                    $clienteTemTimelineTipo->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemTimelineTipo->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemTimelineTipo->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC5 - Erro ao associar a tipo de atendimento ao cliente, motivo: " . json_encode($clienteTemTimelineTipo->getErrors()));
                                        throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                } else {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECC6 - Erro ao associar a o tipo de atendimento ao cliente (" . $value . ")");
                                    throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }

                if ($valid) {

                    if (isset($_POST['Docs']['selection'])) {

                        foreach ($_POST['Docs']['selection'] as $value) {
                            if ($valid) {
                                if (array_key_exists($value, $docs)) {

                                    $clienteTemDocs = new ClienteTemDocs();
                                    $clienteTemDocs->cliente_id = $model->id;
                                    $clienteTemDocs->doc = $value;
                                    $clienteTemDocs->status = TimelineTipo::ATIVO;
                                    $clienteTemDocs->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemDocs->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemDocs->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC30 - Erro ao associar a tipo de documento ao cliente, motivo: " . json_encode($clienteTemDocs->getErrors()));
                                        throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                } else {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECC31 - Erro ao associar a o tipo de documento ao cliente (" . $value . ")");
                                    throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }


                if ($valid) {

                    $transaction->commit();

                    return ['ok'];
                } else {

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

        $municipios = ArrayHelper::map(Municipio::find()->innerJoinWith('estado', false)->where(['municipio.status' => Municipio::ATIVO])->orderBy('estado.nome ASC, nome ASC')->all(), 'id', 'nomeEstado', 'estado.nome');

        $tiposParametros = [ClienteTemParametro::LABEL => 'Label', ClienteTemParametro::CSS => 'CSS', ClienteTemParametro::NIVEL => 'Nível intervalo', ClienteTemParametro::GERAL => 'Geral'];

        $tiposParametrosCorrigido = '';
        foreach ($tiposParametros as $key => $value) {
            $tiposParametrosCorrigido .= '<option value="' . $key . '">' . $value . '</option>';
        }

        $faixasPadrao = \app\models\Base::faixasPadrao();

        return $this->render('create', [
            'model' => $model,
            'municipios' => $municipios,
            'searchModelVertical' => $searchModelVertical,
            'dataProviderVertical' => $dataProviderVertical,
            'modelParametro' => $modelParametro,
            'tiposParametros' => $tiposParametros,
            'tiposParametrosCorrigido' => $tiposParametrosCorrigido,
            'modelServico' => $modelServico,
            'searchModelTimelineTipo' => $searchModelTimelineTipo,
            'dataProviderTimelineTipo' => $dataProviderTimelineTipo,
            'docs' => $docs,
            'docsExiste' => [],
            'modelFaixa' => $modelFaixa,
            'faixasPadrao' => $faixasPadrao,
            'modelUnidadeNegocio' => $modelUnidadeNegocio,
        ]);
    }

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

        \app\models\Base::loga("Acessou a atualização do Cliente", $_GET, $_POST, 33);

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

        $modelParametro = new ClienteTemParametro();

        $modelServico = new ClienteTemServico();

        $modelFaixa = new ClienteTemFaixa();

        $searchModelVertical = new VerticalSearch();
        $queryParamsVertical = array_merge(array(), Yii::$app->request->getQueryParams());
        $queryParamsVertical["VerticalSearch"]["status"] = Vertical::ATIVO;
        $dataProviderVertical = $searchModelVertical->search($queryParamsVertical);
        $dataProviderVertical->pagination->pageSize = 100000;


        $searchModelTimelineTipo = new TimelineTipoSearch();
        $queryParamsTimelineTipo = array_merge(array(), Yii::$app->request->getQueryParams());
        $queryParamsTimelineTipo["TimelineTipoSearch"]["status"] = TimelineTipo::ATIVO;
        $dataProviderTimelineTipo = $searchModelTimelineTipo->search($queryParamsTimelineTipo);
        $dataProviderTimelineTipo->pagination->pageSize = 100000;

        $modelUnidadeNegocio = new UnidadeNegocio();

        $docs = [
            ClienteTemDocs::PARECER_TECNICO => 'Parecer Técnico',
            ClienteTemDocs::RECOMENDACAO_TECNICA => 'Recomendações Técnicas',
            ClienteTemDocs::PLANO_APLICACAO_FULL => 'Plano de Aplicação Full',
            ClienteTemDocs::PLANO_APLICACAO_BASIC => 'Plano de Aplicação Basic',
            ClienteTemDocs::DOCUMENTOS => 'Documentos',
            ClienteTemDocs::FOTOS => 'Fotos',
        ];

        if ($model->load(Yii::$app->request->post())) {
            //Utils::debug(Yii::$app->request->post());
            $valid = true;

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

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

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

                if ($model->logoFile) {
                    $nome = md5(date('Ymd') . $model->nome);

                    $model->logo = $nome . '.' . $model->logoFile->extension;

                    if (!$model->upload()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECC1 - Erro ao salvar a logo");
                        //throw new HttpException(500, "ECC1 - Erro ao salvar a logo");
                    }
                }

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

                if ($model->logoFileMiniatura) {
                    $nome = md5(date('Ymd') . $model->nome . 'miniatura');

                    $model->logo_mini = $nome . '.' . $model->logoFileMiniatura->extension;

                    if (!$model->uploadMiniatura()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECC1 - Erro ao salvar a logo miniatura");
                        //throw new HttpException(500, "ECC1 - Erro ao salvar a logo");
                    }
                }

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

                if ($model->timbreFileMiniatura) {
                    $nome = md5(date('Ymd') . $model->nome . 'timbre');

                    $model->timbre = $nome . '.' . $model->timbreFileMiniatura->extension;

                    if (!$model->uploadTimbre()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECC1 - Erro ao salvar o timbre");
                        //throw new HttpException(500, "ECC1 - Erro ao salvar a logo");
                    }
                }

                if ($valid) {
                    if (!$model->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECC2 - Erro ao salvar o cliente, motivo: " . json_encode($model->getErrors()));
                        //throw new HttpException(500, "ECC2 - Erro ao salvar o cliente, motivo: " . json_encode($model->getErrors()));
                    }
                }

                if ($valid) {

                    foreach ($model->clienteTemVerticals as $clienteTemVertical) {
                        if ($valid) {
                            $clienteTemVertical->status = ClienteTemVertical::INATIVO;
                            if (!$clienteTemVertical->save()) {
                                $valid = false;
                                \Yii::$app->session->setFlash('error', "ECC6 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                //throw new HttpException(500, "ECC6 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {

                    if (isset($_POST['Vertical']['selection'])) {
                        $verticaisAtivas = Vertical::find()->select('id')->where(['status' => Vertical::ATIVO])->column();

                        foreach ($_POST['Vertical']['selection'] as $value) {
                            if ($valid) {
                                if (in_array($value, $verticaisAtivas)) {

                                    $clienteTemVertical = new ClienteTemVertical();
                                    $clienteTemVertical->cliente_id = $model->id;
                                    $clienteTemVertical->vertical_id = $value;
                                    $clienteTemVertical->status = Vertical::ATIVO;
                                    $clienteTemVertical->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemVertical->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemVertical->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                        //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                } else {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                    //throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }

                if ($valid) {

                    foreach ($model->clienteTemParametros as $clienteTemParametro) {
                        if ($valid) {
                            $clienteTemParametro->status = ClienteTemParametro::INATIVO;
                            if (!$clienteTemParametro->save()) {
                                $valid = false;
                                \Yii::$app->session->setFlash('error', "ECC7 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemParametro->getErrors()));
                                //throw new HttpException(500, "ECC7 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {

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

                        if (isset($_POST['ClienteTemParametro']['parametro'])) {

                            foreach ($_POST['ClienteTemParametro']['parametro'] as $key => $parametro) {

                                if (!empty($parametro)) {

                                    if (!empty($_POST['ClienteTemParametro']['valor'][$key])) {

                                        $clienteTemParametro = new ClienteTemParametro();
                                        $clienteTemParametro->cliente_id = $model->id;
                                        $clienteTemParametro->tipo = $_POST['ClienteTemParametro']['tipo'][$key];
                                        $clienteTemParametro->parametro = $parametro;
                                        $clienteTemParametro->valor = $_POST['ClienteTemParametro']['valor'][$key];
                                        $clienteTemParametro->status = ClienteTemParametro::ATIVO;
                                        $clienteTemParametro->created_by = Yii::$app->user->identity->id ?? null;
                                        $clienteTemParametro->created_at = date('Y-m-d H:i:s');

                                        if (!$clienteTemParametro->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECC5 - Erro ao salvar os parametros, motivo: " . json_encode($clienteTemParametro->getErrors()));
                                            //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if ($valid) {
                    \Yii::$app
                        ->db
                        ->createCommand()
                        ->delete('cliente_tem_faixa', ['cliente_id' => $model->id])
                        ->execute();
                }
                if ($valid) {

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

                        foreach ($_POST['ClienteTemFaixa']['de'] as $key => $faixa) {

                            $clienteTemFaixa = new ClienteTemFaixa();
                            $clienteTemFaixa->cliente_id = $model->id;
                            $clienteTemFaixa->de = $_POST['ClienteTemFaixa']['de'][$key];
                            $clienteTemFaixa->ate = $_POST['ClienteTemFaixa']['ate'][$key];
                            $clienteTemFaixa->cor = $_POST['ClienteTemFaixa']['cor'][$key];
                            $clienteTemFaixa->created_by = Yii::$app->user->identity->id ?? null;
                            $clienteTemFaixa->created_at = date('Y-m-d H:i:s');

                            if (!$clienteTemFaixa->save()) {
                                $valid = false;
                                \Yii::$app->session->setFlash('error', "ECCF - Erro ao salvar as faixas, motivo: " . json_encode($clienteTemFaixa->getErrors()));
                                //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }


                if ($valid) {

                    foreach ($model->clienteTemServicos as $clienteTemServico) {
                        if ($valid) {
                            $clienteTemServico->status = ClienteTemServico::INATIVO;
                            if (!$clienteTemServico->save()) {
                                $valid = false;
                                \Yii::$app->session->setFlash('error', "ECC7A - Erro ao excluir os serviços existentes do cliente, motivo: " . json_encode($clienteTemServico->getErrors()));
                                //throw new HttpException(500, "ECC7 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {

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

                        if (isset($_POST['ClienteTemServico']['servico'])) {

                            foreach ($_POST['ClienteTemServico']['servico'] as $key => $servico) {

                                if (!empty($servico)) {

                                    if (!empty($_POST['ClienteTemServico']['servico'][$key])) {

                                        $clienteTemServico = new ClienteTemServico();
                                        $clienteTemServico->cliente_id = $model->id;
                                        $clienteTemServico->servico = $_POST['ClienteTemServico']['servico'][$key];
                                        $clienteTemServico->status = ClienteTemServico::ATIVO;
                                        $clienteTemServico->created_by = Yii::$app->user->identity->id ?? null;
                                        $clienteTemServico->created_at = date('Y-m-d H:i:s');

                                        if (!$clienteTemServico->save()) {
                                            $valid = false;
                                            \Yii::$app->session->setFlash('error', "ECC5A - Erro ao salvar os serviços, motivo: " . json_encode($clienteTemServico->getErrors()));
                                            //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if ($valid) {

                    foreach ($model->clienteTemTimelineTipos as $clienteTemtimelineTipo) {
                        if ($valid) {
                            $clienteTemtimelineTipo->status = ClienteTemTimelineTipo::INATIVO;
                            if (!$clienteTemtimelineTipo->save()) {
                                $valid = false;
                                \Yii::$app->session->setFlash('error', "ECC7 - Erro ao excluir os tipos de atendimentos existentes do cliente, motivo: " . json_encode($clienteTemtimelineTipo->getErrors()));
                                //throw new HttpException(500, "ECC6 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {

                    if (isset($_POST['TimelineTipo']['selection'])) {
                        $timeTiposAtivos = TimelineTipo::find()->select('id')->where(['status' => TimelineTipo::ATIVO])->column();

                        foreach ($_POST['TimelineTipo']['selection'] as $value) {
                            if ($valid) {
                                if (in_array($value, $timeTiposAtivos)) {

                                    $clienteTemTimelineTipo = new ClienteTemTimelineTipo();
                                    $clienteTemTimelineTipo->cliente_id = $model->id;
                                    $clienteTemTimelineTipo->timeline_tipo_id = $value;
                                    $clienteTemTimelineTipo->status = TimelineTipo::ATIVO;
                                    $clienteTemTimelineTipo->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemTimelineTipo->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemTimelineTipo->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC8 - Erro ao associar a tipo de atendimento ao cliente, motivo: " . json_encode($clienteTemTimelineTipo->getErrors()));
                                        //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                } else {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECC9 - Erro ao associar a o tipo de atendimento ao cliente (" . $value . ")");
                                    //throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }

                //docs
                if ($valid) {

                    foreach ($model->clienteTemDocs as $clienteTemDoc) {
                        if ($valid) {
                            $clienteTemDoc->status = ClienteTemDocs::INATIVO;
                            if (!$clienteTemDoc->save()) {
                                $valid = false;
                                \Yii::$app->session->setFlash('error', "ECC33 - Erro ao excluir os docs existentes do cliente, motivo: " . json_encode($clienteTemDoc->getErrors()));
                                //throw new HttpException(500, "ECC6 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            }
                        }
                    }
                }

                if ($valid) {

                    if (isset($_POST['Docs']['selection'])) {

                        foreach ($_POST['Docs']['selection'] as $value) {
                            if ($valid) {
                                if (array_key_exists($value, $docs)) {

                                    $clienteTemDocs = new ClienteTemDocs();
                                    $clienteTemDocs->cliente_id = $model->id;
                                    $clienteTemDocs->doc = $value;
                                    $clienteTemDocs->status = TimelineTipo::ATIVO;
                                    $clienteTemDocs->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemDocs->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemDocs->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC33 - Erro ao associar a tipo de documento ao cliente, motivo: " . json_encode($clienteTemDocs->getErrors()));
                                        //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                } else {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECC34 - Erro ao associar a o tipo de documento ao cliente (" . $value . ")");
                                    //throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }

                //atualizando pontuacao do Contexto
                if ($valid) {
                    $contextos = Contexto::find()->where('(rgt-lft)=1')->andWhere(['=', 'active', Contexto::ATIVO])->andWhere(['=', 'cliente_id', $model->id])->all();

                    foreach ($contextos as $contexto) {
                        if ($valid) {
                            $valid = Contexto::geraPontuacao($contexto);
                        }
                    }
                }

                if ($valid) {

                    $transaction->commit();

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

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

        $municipios = ArrayHelper::map(Municipio::find()->innerJoinWith('estado', false)->where(['municipio.status' => Municipio::ATIVO])->orderBy('estado.nome ASC, nome ASC')->all(), 'id', 'nomeEstado', 'estado.nome');

        $tiposParametros = [ClienteTemParametro::LABEL => 'Label', ClienteTemParametro::CSS => 'CSS', ClienteTemParametro::NIVEL => 'Nível intervalo', ClienteTemParametro::GERAL => 'Geral'];

        $tiposParametrosCorrigido = '';
        foreach ($tiposParametros as $key => $value) {
            $tiposParametrosCorrigido .= '<option value="' . $key . '">' . $value . '</option>';
        }

        $docsExiste = [];

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

        $faixasPadrao = \app\models\Base::faixasPadrao();

        return $this->render('update', [
            'model' => $model,
            'municipios' => $municipios,
            'searchModelVertical' => $searchModelVertical,
            'dataProviderVertical' => $dataProviderVertical,
            'modelParametro' => $modelParametro,
            'tiposParametros' => $tiposParametros,
            'tiposParametrosCorrigido' => $tiposParametrosCorrigido,
            'modelServico' => $modelServico,
            'searchModelTimelineTipo' => $searchModelTimelineTipo,
            'dataProviderTimelineTipo' => $dataProviderTimelineTipo,
            'docs' => $docs,
            'docsExiste' => $docsExiste,
            'modelFaixa' => $modelFaixa,
            'faixasPadrao' => $faixasPadrao,
            'modelUnidadeNegocio' => $modelUnidadeNegocio,
        ]);
    }

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

        \app\models\Base::loga("Acessou a exclusão de Cliente", $_GET, $_POST, 34);

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

        $valid = true;

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

        $transaction = $connection->beginTransaction();

        try {

            $model->status = Cliente::INATIVO;

            if ($valid) {
                if (!$model->save()) {
                    $valid = false;
                    //\Yii::$app->session->setFlash('error', "EEC1 - Erro ao excluir o cliente, motivo: " . json_encode($model->getErrors()));
                    throw new HttpException(500, "ECC2 - Erro ao salvar o cliente, motivo: " . json_encode($model->getErrors()));
                }
            }

            if ($valid) {

                foreach ($model->clienteTemVerticals as $clienteTemVertical) {
                    if ($valid) {
                        $clienteTemVertical->status = ClienteTemVertical::INATIVO;
                        if (!$clienteTemVertical->save()) {
                            $valid = false;
                            //\Yii::$app->session->setFlash('error', "EEC2 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                            throw new HttpException(500, "ECC6 - Erro ao excluir as verticais existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                        }
                    }
                }
            }

            if ($valid) {

                foreach ($model->clienteTemParametros as $clienteTemParametro) {
                    if ($valid) {
                        $clienteTemParametro->status = ClienteTemParametro::INATIVO;
                        if (!$clienteTemParametro->save()) {
                            $valid = false;
                            //\Yii::$app->session->setFlash('error', "EEC3 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemParametro->getErrors()));
                            throw new HttpException(500, "ECC7 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                        }
                    }
                }
            }

            if ($valid) {

                foreach ($model->projetos as $projeto) {
                    if ($valid) {
                        $projeto->verticais = 1;
                        $projeto->status = Projeto::INATIVO;
                        if (!$projeto->save()) {
                            $valid = false;
                            //\Yii::$app->session->setFlash('error', "EEC6 - Erro ao excluir os projetos existentes do cliente, motivo: " . json_encode($projeto->getErrors()));
                            throw new HttpException(500, "ECC7 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                        }
                    }
                }
            }

            if ($valid) {
                foreach ($model->contextos as $contexto) {
                    if ($valid) {
                        $contexto->active = Contexto::INATIVO;
                        if (!$contexto->save()) {
                            $valid = false;
                            //\Yii::$app->session->setFlash('error', "EEC4 - Erro ao excluir os contextos existentes do cliente, motivo: " . json_encode($contexto->getErrors()));
                            throw new HttpException(500, "ECC7 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                        }

                        if ($valid) {
                            foreach ($contexto->coletas as $coleta) {
                                if ($valid) {
                                    $coleta->status = Coleta::INATIVO;
                                    if (!$coleta->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "EEC5 - Erro ao excluir as coletas existentes do cliente, motivo: " . json_encode($coleta->getErrors()));
                                        //throw new HttpException(500, "ECC7 - Erro ao excluir os parametros existentes do cliente, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if ($valid) {

                $transaction->commit();
            } else {

                $transaction->rollback();
            }
        } catch (Exception $e) {
            $transaction->rollback();
            throw new HttpException(500, $e->getMessage());
        }
        //        $model->status = Cliente::INATIVO;
        //
        //        if (!$model->save()) {
        //
        //            $msgErro = '<ul>';
        //            foreach ($model->getErrors() as $key => $value) {
        //                $msgErro .= '<li>' . $key . ': ' . $value . '</li>';
        //            }
        //            $msgErro .= '</ul>';
        //            throw new HttpException(500, "Erro ao excluir o Cliente, motivo: " . $msgErro);
        //        }
        //
        if ($valid) {
            //   return $this->redirect(['index']);
            return json_encode([]);
        } else {
            return $this->redirect(Yii::$app->request->referrer);
        }
    }

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

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

    public function actionListaVerticaisPossiveis()
    {

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

                $list = ClienteTemVertical::find()->where(['cliente_id' => $clienteId, 'status' => ClienteTemVertical::ATIVO])->all();
                $selected = null;
                if ($clienteId != null && count($list) > 0) {
                    $selected = '';
                    foreach ($list as $account) {
                        if ($account->vertical->status == Vertical::ATIVO) {
                            $out[] = ['id' => $account->vertical->id, 'name' => $account->vertical->regraNome];
                        }
                    }

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

                            $projetoTemVerticais = ProjetoTemVertical::find()->where(['projeto_id' => $_POST['depdrop_all_params']['projeto'], 'status' => ProjetoTemVertical::ATIVO])->all();

                            if ($projetoTemVerticais) {

                                foreach ($projetoTemVerticais as $projetoTemVertical)
                                    $selected[] = $projetoTemVertical->vertical_id;
                            }
                        }
                    }
                }

                return Json::encode(['output' => $out, 'selected' => $selected]);
            }
            return Json::encode(['output' => $out, 'selected' => '']);
        }
        return Json::encode(['output' => '', 'selected' => '']);
    }

    public function actionBuscaFaixaPadrao()
    {

        $niveisValorGlobal = [];


        $niveisValorGlobal = \app\models\Base::faixasPadrao();

        $retorno = '';
        foreach ($niveisValorGlobal as $key => $faixa) {
            $retorno .= '<div class="row divfaixa" id="divfaixa">
                    <div class="col-lg-4">
                        <input type="number" id="projetotemfaixa-de" class="form-control" name="ClienteTemFaixa[de][]"  value="' . $faixa["from"] . '" maxlength="255" aria-invalid="false">
                    </div>
                    <div class="col-lg-4">
                        <input type="number" id="projetotemfaixa-ate" class="form-control" name="ClienteTemFaixa[ate][]"  value="' . $faixa["to"] . '" maxlength="255" aria-invalid="false">
                    </div>
                    <div class="col-lg-3">                  
                        <input type="color" id="projetotemfaixa-cor" class="form-control" name="ClienteTemFaixa[cor][]"  value="' . $faixa["color"] . '" maxlength="255">
                    </div>                    
                    <div class="col-lg-1 divremovefaixa" style="display:none">                  
                        <a href="javascript:void(0)" class="removefaixa btn btn-danger"><i class="fa fa-trash"></i></a>
                    </div>                    
                </div>';
        }

        return $retorno;
    }

    /*
      #4684 - Gestão de scope
      27/07/2020
     */

    public function actionEscopoAtualiza()
    {

        \app\models\Base::loga("Acessou a atualização do Escopo (Organograma) do Cliente", $_GET, $_POST, 32);

        // Utils::debug($_POST);
        $this->layout = '//empty';

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

        $id = $aplicacao_id = $cliente_id = $contexto_id = null;
        if (isset($post['Scope'])) {
            $id = $post['Scope']['id'];
            $aplicacao_id = $post['Scope']['aplicacao_id'];
            $cliente_id = $post['Scope']['cliente_id'];
            $contexto_id = $post['Scope']['contexto_id'];
        }

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

        if (!$model) {
            return Json::encode(array('status' => 'error', 'type' => 'error', 'message' => "Item não encontrado"));
        }

        $paiOriginal = $model->parent_id;

        $emailOriginal = $model->respondido_email;

        $nomeClienteContexto = getenv('NOME_PLATAFORMA');
        if ($model->cliente_id) {
            $nomeClienteContexto = $model->cliente->nome;
        }
        if ($model->contexto_id) {
            $nomeClienteContexto = $model->contexto->name;
        }

        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            $transaction = \Yii::$app->db->beginTransaction();
            try {

                if ($model->filho) {

                    $novoScope = new Scope();
                    $novoScope->type = Scope::TYPE_GERENCIA;
                    $novoScope->name = $model->filho;
                    $novoScope->parent_id = $model->id;
                    $novoScope->status = Scope::STATUS_ACTIVE;
                    $novoScope->root = $model->root;
                    $novoScope->cliente_id = $model->cliente_id;
                    $novoScope->contexto_id = $model->contexto_id;
                    $novoScope->respondido_por = $_POST['Scope']['filhoacesso'] ?? null;
                    $novoScope->respondido_email = $_POST['Scope']['filhoemail'] ?? null;
                    $novoScope->geral_especifico = $_POST['Scope']['filhogeralespecifico'] ?? null;
                    $novoScope->responde_inventario = $_POST['Scope']['filhorespondeinventario'] ?? null;

                    if ($novoScope->respondido_email) {

                        $novoToken = Yii::$app->security->generateRandomString(250);
                        $novoScope->token = $novoToken;

                        $dados = [];
                        $dados['scope'] = $novoScope;

                        EmailTemplate::enviaEmail(EmailTemplate::TIPO_RESPONSAVEL_SCOPO, $dados, $novoScope->respondido_email, 'Mapeamento de dados ' . $nomeClienteContexto);

                        // Yii::$app->mailer->compose('_inventario', [
                        //     'model' => $novoScope,
                        // ])
                        //     ->setFrom('no-reply@krinom.com.br')
                        //     ->setTo($novoScope->respondido_email)
                        //     //    ->setBcc(['gledson@krinom.com.br'])
                        //     ->setSubject('Mapeamento de dados ' . $nomeClienteContexto)
                        //     ->send();
                    }

                    if (!$novoScope->save()) {
                        $transaction->rollBack();
                        return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => "Erro ao salvar o item, motivo: " . Json::encode($novoScope->getErrors())));
                    }
                }

                if (empty($model->parent_id)) {
                    $model->parent_id = $paiOriginal;
                }

                if ($model->validate()) {


                    if ($model->respondido_email && $emailOriginal != $model->respondido_email) {


                        $token = Yii::$app->security->generateRandomString(250);
                        $model->token = $token;

                        $dados = [];
                        $dados['scope'] = $model;

                        EmailTemplate::enviaEmail(EmailTemplate::TIPO_RESPONSAVEL_SCOPO, $dados, $model->respondido_email, 'Mapeamento de dados ' . $nomeClienteContexto);

                        // Yii::$app->mailer->compose('_inventario', [
                        //     'model' => $model,
                        // ]) // a view rendering result becomes the message body here
                        //     ->setFrom('no-reply@krinom.com.br')
                        //     ->setTo($model->respondido_email)
                        //     //     ->setBcc(['gledson@krinom.com.br'])
                        //     ->setSubject('Mapeamento de dados ' . $nomeClienteContexto)
                        //     ->send();
                    }

                    $flag = $model->save(false);
                    if ($flag == true) {
                        $transaction->commit();

                        $contexto = Contexto::findOne($contexto_id);
                        $organogramaContexto = Contexto::organograma($contexto, 'contexto');
                        $organogramaModal = Contexto::organograma($contexto, 'modal');

                        return Json::encode(array(
                            'status' => 'success',
                            'type' => 'success',
                            'message' => 'Item salvo com sucesso.',
                            'dadosContexto' => $organogramaContexto['dados'] ?? null,
                            'dadosModal' => $organogramaModal['dados'] ?? null,
                            'dadosPaiFilho' => $organogramaModal['paiFilho'] ?? null,
                        ));
                    } else {
                        $transaction->rollBack();
                    }
                } else {
                    return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => Json::encode($model->getErrors())));
                }
            } catch (Exception $ex) {
                $transaction->rollBack();
            }
        }

        $url = \yii\helpers\Url::to(['/performance/contexto/view', 'id' => $contexto_id, 'aplicacao_id' => $aplicacao_id, '#' => 'analisetecnica'], true);
        return $this->redirect($url)->send();
    }

    public function actionEscopoExclui()
    {

        \app\models\Base::loga("Excluiu o Escopo (Organograma) do Cliente", $_GET, $_POST, 32);

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

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

        $id = $post['Scope']['id'];
        $aplicacao_id = $post['Scope']['aplicacao_id'];
        $cliente_id = $post['Scope']['cliente_id'];
        $contexto_id = $post['Scope']['contexto_id'];

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

        if (!$model) {
            return Json::encode(array('status' => 'error', 'type' => 'error', 'message' => "Item não encontrado"));
        }

        if (is_null($model->parent_id)) {

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

            if ($model->name != $post['Scope']['name']) {
                return Json::encode(array('status' => 'error', 'type' => 'error', 'message' => "Esse item não pode ser renomeado/excluído"));
            }
        }

        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            $transaction = \Yii::$app->db->beginTransaction();
            try {

                $filhos = Scope::getRecursiveScopesIds([$model->id]);

                if (!empty($filhos)) {
                    Scope::updateAll(['status' => Scope::STATUS_INACTIVE], ['id' => $filhos]);
                }

                $model->status = Scope::STATUS_INACTIVE;

                if ($model->validate()) {
                    $flag = $model->save(false);
                    if ($flag == true) {

                        $contexto = Contexto::findOne($contexto_id);
                        $organogramaContexto = Contexto::organograma($contexto, 'contexto');
                        $organogramaModal = Contexto::organograma($contexto, 'modal');

                        $transaction->commit();
                        return Json::encode(array(
                            'status' => 'success',
                            'type' => 'success',
                            'message' => 'Item salvo com sucesso.',
                            'dadosContexto' => $organogramaContexto['dados'] ?? null,
                            'dadosModal' => $organogramaModal['dados'] ?? null,
                        ));
                    } else {
                        $transaction->rollBack();
                    }
                } else {
                    return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => Json::encode($model->getErrors())));
                }
            } catch (Exception $ex) {
                $transaction->rollBack();
            }
        }
    }

    public function actionMeuEscritorio($id = null)
    {

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

        \app\models\Base::loga("Acessou o Meu Escritório", $_GET, $_POST, 1);

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

        if ($isCeon) {
            $model = Cliente::findOne($id);
        } else {

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

        if (!$model) {
            throw new NotFoundHttpException('Escritório não encontrado');
        }

        $searchModel = new \app\models\UserSearch();

        if ($searchModel->status == "") {
            $searchModel->status = \app\models\User::STATUS_ACTIVE;
        }

        $params = [];
        $params['cliente_id'] = $model->id;
        $params = array_merge($params, Yii::$app->request->queryParams);

        $dataProvider = $searchModel->searchEscritorio($params);

        $searchModelResponsavel = new \app\models\UserSearch();

        if ($searchModelResponsavel->status == "") {
            $searchModelResponsavel->status = \app\models\User::STATUS_ACTIVE;
        }

        $paramsResponsavel = [];
        $paramsResponsavel['cliente_id'] = $model->id;
        $paramsResponsavel = array_merge($paramsResponsavel, Yii::$app->request->queryParams);

        $dataProviderResponsavel = $searchModelResponsavel->searchResponsavel($paramsResponsavel);

        $searchModelSupervisores = new \app\models\UserSearch();

        if ($searchModelSupervisores->status == "") {
            $searchModelSupervisores->status = \app\models\User::STATUS_ACTIVE;
        }

        $dataProviderSupervisores = $searchModelSupervisores->searchSupervisor($params);


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

            $valid = true;

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

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

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

                if ($model->logoFile) {
                    $nome = md5(date('Ymd') . $model->nome);

                    $model->logo = $nome . '.' . $model->logoFile->extension;

                    if (!$model->upload()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECC1 - Erro ao salvar a logo");
                    }
                }

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

                if ($valid) {

                    $transaction->commit();

                    return $this->redirect(['/site/index']);
                } else {

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

        $searchModelOperadores = new \app\models\UserSearch();

        if ($searchModelOperadores->status == "") {
            $searchModelOperadores->status = \app\models\User::STATUS_ACTIVE;
        }

        $params = [];
        $params['cliente_id'] = $model->id;

        $contextosIds = Contexto::find()->select('id')->where(['cliente_id' => $model->id, 'active' => 1])->column();
        $params['contexto_ids'] = $contextosIds;
        $params = array_merge($params, Yii::$app->request->queryParams);

        $dataProviderOperadores = $searchModelOperadores->searchOperador($params);

        $listaContextos = ArrayHelper::map(Contexto::find()
            ->where('rgt-lft=1')
            ->andwhere([
                'cliente_id' => $model->id,
                'active' => Contexto::ATIVO
            ])
            ->all(), 'id', 'name');

        return $this->render('meu-escritorio', [
            'model' => $model,
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'searchModelResponsavel' => $searchModelResponsavel,
            'dataProviderResponsavel' => $dataProviderResponsavel,
            'searchModelOperadores' => $searchModelOperadores,
            'dataProviderOperadores' => $dataProviderOperadores,
            'listaContextos' => $listaContextos,
            'searchModelSupervisores' => $searchModelSupervisores,
            'dataProviderSupervisores' => $dataProviderSupervisores,
        ]);
    }

    public function actionEscopoEnviaLink()
    {

        \app\models\Base::loga("Acessou o envio de Link de Resposta do Escopo (Organograma) do Cliente", $_GET, $_POST, 32);

        if (!\app\models\GenericSearch::filterMyClientes()->query->andWhere(['=', 'id', $_POST['Scope']['cliente_id'] ?? null])->exists()) {
            throw new HttpException(500, 'Cliente não pertence a seu escritório');
        }

        // Utils::debug($_POST);
        $this->layout = '//empty';

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

        $id = $post['Scope']['id'];
        $aplicacao_id = $post['Scope']['aplicacao_id'];
        $cliente_id = $post['Scope']['cliente_id'];
        $contexto_id = $post['Scope']['contexto_id'];

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

        if (!$model) {
            return Json::encode(array('status' => 'error', 'type' => 'error', 'message' => "Item não encontrado"));
        }

        $paiOriginal = $model->parent_id;

        $emailOriginal = $model->respondido_email;

        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            $transaction = \Yii::$app->db->beginTransaction();
            try {

                if (empty($model->parent_id)) {
                    $model->parent_id = $paiOriginal;
                }

                if ($model->validate()) {

                    if ($model->respondido_email) {

                        $token = Yii::$app->security->generateRandomString(250);
                        $model->token = $token;

                        $nomeClienteContexto = getenv('NOME_PLATAFORMA');
                        if ($model->cliente_id) {
                            $nomeClienteContexto = $model->cliente->nome;
                        }
                        if ($model->contexto_id) {
                            $nomeClienteContexto = $model->contexto->name;
                        }

                        $dados = [];
                        $dados['scope'] = $model;

                        EmailTemplate::enviaEmail(EmailTemplate::TIPO_RESPONSAVEL_SCOPO, $dados, $model->respondido_email, 'Mapeamento de dados ' . $nomeClienteContexto);

                        // Yii::$app->mailer->compose('_inventario', [
                        //     'model' => $model,
                        // ]) // a view rendering result becomes the message body here
                        //     ->setFrom('no-reply@krinom.com.br')
                        //     ->setTo($model->respondido_email)
                        //     //    ->setBcc(['gledson@krinom.com.br'])
                        //     ->setSubject('Mapeamento de dados ' . $nomeClienteContexto)
                        //     ->send();
                    }

                    $flag = $model->save(false);
                    if ($flag == true) {
                        $transaction->commit();

                        $contexto = Contexto::findOne($contexto_id);
                        $organogramaContexto = Contexto::organograma($contexto, 'contexto');
                        $organogramaModal = Contexto::organograma($contexto, 'modal');

                        return Json::encode(array(
                            'status' => 'success',
                            'type' => 'success',
                            'message' => 'Item salvo com sucesso.',
                            'dadosContexto' => $organogramaContexto['dados'] ?? null,
                            'dadosModal' => $organogramaModal['dados'] ?? null,
                            'dadosPaiFilho' => $organogramaModal['paiFilho'] ?? null,
                        ));
                    } else {
                        $transaction->rollBack();
                    }
                } else {
                    return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => Json::encode($model->getErrors())));
                }
            } catch (Exception $ex) {
                $transaction->rollBack();
            }
        }

        $url = \yii\helpers\Url::to(['/performance/contexto/view', 'id' => $contexto_id, 'aplicacao_id' => $aplicacao_id, '#' => 'analisetecnica'], true);
        return $this->redirect($url)->send();
    }

    public function actionNovo()
    {


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

        $cliente = new Cliente();

        $cliente->ordem = Cliente::proximaOrdem();

        //Utils::debug($cliente);

        $cliente->contato_comercial = 1;

        $parceiro = null;

        $searchModelVertical = new VerticalSearch();
        $queryParamsVertical = array_merge(array(), Yii::$app->request->getQueryParams());
        $queryParamsVertical["VerticalSearch"]["status"] = Vertical::ATIVO;
        $dataProviderVertical = $searchModelVertical->search($queryParamsVertical);
        $dataProviderVertical->pagination->pageSize = 100000;


        if (!empty($params = Yii::$app->request->post())) {

            \app\models\Base::loga("Cadastrou como novo usuário/escritório", $_GET, $_POST, 1);

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

            try {
                $valid = true;
                $msgErro = '';

                if ($valid) {
                    $cliente->load($params);
                    //$cliente->nome = $user->name;
                    //$cliente->municipio_id = $municipioId;
                    //$cliente->contato_nome = $user->name;
                    //$cliente->contato_numero_email = $user->email;
                    $cliente->status = Cliente::ATIVO;

                    $cliente->pdfImagemFile = UploadedFile::getInstance($cliente, 'pdfImagemFile');

                    if ($cliente->pdfImagemFile) {
                        $nome = 'PDF' . md5(date('Ymd') . $cliente->nome);

                        $cliente->pdf_imagem = $nome . '.' . $cliente->pdfImagemFile->extension;

                        if (!$cliente->uploadPdfImagem()) {

                            $valid = false;
                            throw new HttpException(500, "ECC111 - Erro ao salvar a logo do PDF");
                        }
                    }

                    if (!$cliente->save()) {
                        //  Utils::debug($cliente->getErrors());   
                        $valid = false;
                        foreach ($cliente->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        Yii::$app->session->setFlash('error', $msgErro);
                    }
                }



                Cliente::ajustaOrdem($cliente);


                if ($valid) {
                    $unidadeNegocio = new UnidadeNegocio();
                    $unidadeNegocio->nome = UnidadeNegocio::NOME_PADRAO_LGPD;
                    $unidadeNegocio->cliente_id = $cliente->id;
                    $unidadeNegocio->status = UnidadeNegocio::ATIVO;

                    if (!$unidadeNegocio->save()) {
                        //  Utils::debug(microtime());
                        $valid = false;
                        foreach ($unidadeNegocio->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        Yii::$app->session->setFlash('error', $msgErro);
                    }
                }

                if ($valid) {

                    if (isset($_POST['Vertical']['selection'])) {
                        $verticaisAtivas = Vertical::find()->select('id')->where(['status' => Vertical::ATIVO])->column();

                        foreach ($_POST['Vertical']['selection'] as $value) {
                            if ($valid) {
                                if (in_array($value, $verticaisAtivas)) {

                                    $clienteTemVertical = new ClienteTemVertical();
                                    $clienteTemVertical->cliente_id = $cliente->id;
                                    $clienteTemVertical->vertical_id = $value;
                                    $clienteTemVertical->status = Vertical::ATIVO;
                                    $clienteTemVertical->created_by = Yii::$app->user->identity->id ?? null;
                                    $clienteTemVertical->created_at = date('Y-m-d H:i:s');

                                    if (!$clienteTemVertical->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                        //throw new HttpException(500, "ECC3 - Erro ao associar a vertical, motivo: " . json_encode($clienteTemVertical->getErrors()));
                                    }

                                    if ($valid) {
                                        $valid = \app\modules\risk\models\RiscoModelo::copiaModelo($value, $cliente);
                                    }
                                } else {
                                    $valid = false;
                                    //\Yii::$app->session->setFlash('error', "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                    throw new HttpException(500, "ECC4 - Erro ao associar a vertical (" . $value . ")");
                                }
                            }
                        }
                    }
                }

                // if ($valid) {
                //     $projeto = new Projeto();
                //     $projeto->nome = Projeto::NOME_PADRAO_LGPD;
                //     $projeto->cliente_id = $cliente->id;
                //     $projeto->contextos = null;
                //     $projeto->ordem = 1;
                //     $projeto->coleta_necessita_homologacao = 0;
                //     $projeto->created_by = \Yii::$app->user->identity->id ?? null;
                //     $projeto->status = Projeto::ATIVO;

                //     if (!$projeto->save()) {
                //         //Utils::debug(microtime());
                //         $valid = false;
                //         foreach ($projeto->getErrors() as $key => $value) {
                //             foreach ($value as $chave => $erro) {
                //                 $msgErro .= $erro . '<br />';
                //             }
                //         }
                //         Yii::$app->session->setFlash('error', $msgErro);
                //     }
                // }

                // if ($valid) {
                //     $projetoTemVertical = new ProjetoTemVertical();
                //     $projetoTemVertical->projeto_id = $projeto->id;
                //     $projetoTemVertical->vertical_id = Vertical::PADRAO_LGPD;
                //     $projetoTemVertical->ordem = 1;
                //     $projetoTemVertical->status = ProjetoTemVertical::ATIVO;

                //     if (!$projetoTemVertical->save()) {
                //         // Utils::debug(microtime());
                //         $valid = false;
                //         foreach ($projetoTemVertical->getErrors() as $key => $value) {
                //             foreach ($value as $chave => $erro) {
                //                 $msgErro .= $erro . '<br />';
                //             }
                //         }
                //         Yii::$app->session->setFlash('error', $msgErro);
                //     }
                // }
                // if ($valid) {
                //     $faixasPadrao = [];
                //     $faixasPadrao[] = ['de' => 0, 'ate' => 20, 'cor' => '#df5353'];
                //     $faixasPadrao[] = ['de' => 20.01, 'ate' => 80, 'cor' => '#e8dd11'];
                //     $faixasPadrao[] = ['de' => 80.01, 'ate' => 100, 'cor' => '#089f50'];

                //     foreach ($faixasPadrao as $key => $value) {
                //         if ($valid) {
                //             $projetoTemFaixa = new \app\modules\performance\models\ProjetoTemFaixa();
                //             $projetoTemFaixa->projeto_id = $projeto->id;
                //             $projetoTemFaixa->de = $value['de'];
                //             $projetoTemFaixa->ate = $value['ate'];
                //             $projetoTemFaixa->cor = $value['cor'];
                //             $projetoTemFaixa->created_at = date('Y-m-d H:i:s');
                //             $projetoTemFaixa->created_by = \Yii::$app->user->identity->id ?? null;

                //             if (!$projetoTemFaixa->save()) {
                //                 //Utils::debug(microtime());
                //                 $valid = false;
                //                 foreach ($projetoTemFaixa->getErrors() as $key => $value) {
                //                     foreach ($value as $chave => $erro) {
                //                         $msgErro .= $erro . '<br />';
                //                     }
                //                 }
                //                 Yii::$app->session->setFlash('error', $msgErro);
                //             }
                //         }
                //     }
                // }

                if ($valid) {
                    $aplicacao = new Aplicacao();
                    $aplicacao->nome = Aplicacao::NOME_PADRAO_LGPD;
                    $aplicacao->unidade_negocio_id = $unidadeNegocio->id;
                    $aplicacao->status = Aplicacao::ATIVO;
                    $aplicacao->rota = Aplicacao::ROTA_PADRAO_LGPD;
                    $aplicacao->tipo = 1;
                    $aplicacao->importancia = 1;
                    $aplicacao->ordem = 1;
                    $aplicacao->quantidade_contexto = 0;
                    $aplicacao->search_model = '\app\modules\performance\models\ContextoSearch()';
                    $aplicacao->data_provider = 'searchPadraoAplicacao(Yii::$app->request->queryParams)';
                    $aplicacao->icone = '<i class="fas fa-list-ul"></i>';
                    $aplicacao->model_name = 'contexto';
                    $aplicacao->classe_row_unit = 'row font-85 border-bottom py-3';

                    if (!$aplicacao->save()) {
                        // Utils::debug(microtime());
                        $valid = false;
                        foreach ($aplicacao->getErrors() as $key => $value) {
                            foreach ($value as $chave => $erro) {
                                $msgErro .= $erro . '<br />';
                            }
                        }
                        Yii::$app->session->setFlash('error', $msgErro);
                    }
                }

                // if ($valid) {
                //     $aplicacaoTemProjeto = new \app\modules\performance\models\AplicacaoTemProjeto();
                //     $aplicacaoTemProjeto->aplicacao_id = $aplicacao->id;
                //     $aplicacaoTemProjeto->projeto_id = $projeto->id;

                //     if (!$aplicacaoTemProjeto->save()) {
                //         //Utils::debug(microtime());
                //         $valid = false;
                //         foreach ($aplicacaoTemProjeto->getErrors() as $key => $value) {
                //             foreach ($value as $chave => $erro) {
                //                 $msgErro .= $erro . '<br />';
                //             }
                //         }
                //         Yii::$app->session->setFlash('error', $msgErro);
                //     }
                // }

                if ($valid) {
                    //$valid = \app\modules\risk\models\RiscoModelo::copiaModeloLgpd($cliente);
                    //Utils::debug($valid);
                }

                if ($valid) {

                    $itensAnaliseRegulatorias = \app\models\AnaliseRegulatoria::find()
                        ->where([
                            'cliente_id' => 1,
                            'status' => 1
                        ])
                        ->all();

                    foreach ($itensAnaliseRegulatorias as $itemAnaliseRegulatoria) {
                        if ($valid) {

                            $analiseRegulatoria = new \app\models\AnaliseRegulatoria();
                            $analiseRegulatoria->item = $itemAnaliseRegulatoria->item;
                            $analiseRegulatoria->descricao = $itemAnaliseRegulatoria->descricao;
                            $analiseRegulatoria->status = $itemAnaliseRegulatoria->status;
                            $analiseRegulatoria->cliente_id = $cliente->id;

                            if (!$analiseRegulatoria->save()) {
                                //throw new HttpException(json_encode($analiseRegulatoria->getErrors()));
                                $valid = false;
                                foreach ($analiseRegulatoria->getErrors() as $key => $value) {
                                    foreach ($value as $chave => $erro) {
                                        $msgErro .= $erro . '<br />';
                                    }
                                }
                                Yii::$app->session->setFlash('error', $msgErro);
                            }
                        }
                    }
                }

                if ($valid) {
                    foreach ($cliente->modulos as $modulo) {
                        $clienteTemModulo = new ClienteTemModulo();
                        $clienteTemModulo->cliente_id = $cliente->id;
                        $clienteTemModulo->modulo = $modulo;

                        if (!$clienteTemModulo->save()) {
                            $valid = false;
                            foreach ($clienteTemModulo->getErrors() as $key => $value) {
                                foreach ($value as $chave => $erro) {
                                    $msgErro .= $erro . '<br />';
                                }
                            }
                            Yii::$app->session->setFlash('error', $msgErro);
                        }
                    }
                }

                if ($valid) {
                    //if ($_SERVER['SERVER_NAME'] == 'vialgpd.com.br') {
                    //                    Yii::$app->mailer->compose('_novo_escritorio', [
                    //                                'user' => $user,
                    //                            ]) // a view rendering result becomes the message body here
                    //                            ->setFrom('no-reply@krinom.com.br')
                    //                            ->setTo(['gledson@krinom.com.br'])
                    //                            ->setBcc(['gledson@krinom.com.br'])
                    //                            ->setSubject('Novo usuário/escritório cadastrado na')
                    //                            ->send();
                    //
                    //                    Yii::$app->mailer->compose('_novo_usuario', [
                    //                                'user' => $user,
                    //                            ]) // a view rendering result becomes the message body here
                    //                            ->setFrom('no-reply@krinom.com.br')
                    //                            ->setTo($user->email)
                    //                            ->setBcc('gledson@krinom.com.br')
                    //                            ->setSubject('Seja bem-vindo à ')
                    //                            ->send();
                    //}
                }

                if ($valid) {
                    $transaction->commit();
                } else {
                    $transaction->rollBack();
                    $valid = false;
                    // Utils::debug($msgErro);
                }


                if ($valid) {
                    return $this->redirect(['/performance/cliente/index'])->send();
                }
            } catch (Exception $exception) {
                $transaction->rollBack();
                throw new HttpException(500, $exception->getMessage());
            }
        }

        \app\models\Base::loga("Acessou a visualização da criação de página", $_GET, $_POST, 1);

        return $this->render('novo', [
            'cliente' => $cliente,
            'searchModelVertical' => $searchModelVertical,
            'dataProviderVertical' => $dataProviderVertical,
        ]);
    }

    public function actionEscopoDuplica()
    {
        \app\models\Base::loga("Duplicou o Escopo (Organograma) do Cliente", $_GET, $_POST, 32);
        $this->layout = '//empty';
        $post = Yii::$app->request->post();
        $id = $post['Scope']['id'] ?? null;
        $aplicacao_id = $post['Scope']['aplicacao_id'] ?? null;
        $cliente_id = $post['Scope']['cliente_id'] ?? null;
        $contexto_id = $post['Scope']['contexto_id'] ?? null;
        $model = Scope::findOne($id);
        if (!$model) {
            return Json::encode(array('status' => 'error', 'type' => 'error', 'message' => "Item não encontrado"));
        }
        if ($model->id == $model->root) {
            return Json::encode(array('status' => 'error', 'type' => 'error', 'message' => "Esse item não pode ser duplicado"));
        }
        $duplica = Scope::duplica($model, $model->contexto, $model->contexto, $model->name);
        if ($duplica) {
            $contexto = Contexto::findOne($model->contexto_id);
            $organogramaContexto = Contexto::organograma($model->contexto, 'contexto');
            $organogramaModal = Contexto::organograma($model->contexto, 'modal');
            return Json::encode(array(
                'status' => 'success',
                'type' => 'success',
                'message' => 'Item duplicado com sucesso.',
                'dadosContexto' => $organogramaContexto['dados'] ?? null,
                'dadosModal' => $organogramaModal['dados'] ?? null,
                'dadosPaiFilho' => $organogramaModal['paiFilho'] ?? null,
            ));
        } else {
            return Json::encode(array('status' => 'warning', 'type' => 'warning', 'message' => Json::encode($duplica)));
        }
    }

    public function actionMapa()
    {

        $contextos = GenericSearch::filterMyContextosVisualizacao()
            ->query
            ->andWhere('rgt-lft=1')
            ->andWhere('active=1')
            ->all();

        $contextosMapa = [];

        foreach ($contextos as $contexto) {

            $ultimaColeta = $contexto->ultimaColeta;

            $pontuacao = null;

            if ($ultimaColeta) {
                $pontuacao = $ultimaColeta->valorGlobal;
            }

            $icone = Aplicacao::ICONE_COMPROMETEDOR;
            $tipo = Aplicacao::TIPO_COMPROMETEDOR;

            if (is_null($pontuacao)) {
                $icone = Aplicacao::ICONE_SEM_PONTUACAO;
            } else {

                if ($pontuacao > Aplicacao::MINIMO_MERCADO) {
                    $icone = Aplicacao::ICONE_MERCADO;
                    $tipo = Aplicacao::TIPO_MERCADO;
                }

                if ($pontuacao > Aplicacao::MINIMO_EXCELENTE) {
                    $icone = Aplicacao::ICONE_EXCELENTE;
                    $tipo = Aplicacao::TIPO_EXCELENTE;
                }
            }

            if ($contexto->latitude) {
                $contextosMapa[] = [
                    'id' => $contexto->id,
                    'cliente_id' => $contexto->cliente->id,
                    'latitude' => $contexto->latitude,
                    'longitude' => $contexto->longitude,
                    'nome' => $contexto->name,
                    'icone' => $icone,
                    'tipo' => $tipo,
                    'pontuacao' => $pontuacao + 0,
                    'pvfs' => [],
                ];
            }
        }

        return $this->render('mapa', [
            'contextosMapa' => $contextosMapa,
        ]);
    }

    public function actionListaContextoCadastroUsuario()
    {

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

                $list = Contexto::find()->where(['cliente_id' => $clienteId, 'active' => Cliente::ATIVO])->all();
                $selected = null;
                if ($clienteId != null && count($list) > 0) {
                    $selected = '';
                    foreach ($list as $account) {

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

                return Json::encode(['output' => $out, 'selected' => $selected]);
            }
            return Json::encode(['output' => $out, 'selected' => '']);
        }
        return Json::encode(['output' => '', 'selected' => '']);
    }

    public function actionExportar($cliente_id)
    {
        \app\models\Base::loga("Acessou o a Exportação deContextos", $_GET, $_POST, 2);

        $cliente = Cliente::findOne($cliente_id);

        $models = Contexto::find()
            ->where([
                'cliente_id' => $cliente_id,
                'active' => Contexto::ATIVO,
            ])
            ->orderBy('id DESC')
            ->all();

        $colunas = [];

        $colunas[] = [
            'attribute' => 'name',
            'header' => 'Nome',
            'format' => 'text',
            'value' => function ($model) {
                return $model->name ?? 'N/D';
            },
        ];
        $colunas[] = [
            'attribute' => 'natureza',
            'header' => 'Natureza',
            'format' => 'text',
            'value' => function ($model) {
                return $model->natureza ?? 'N/D';
            },
        ];

        $colunas[] = [
            'attribute' => 'endereco',
            'header' => 'Endereço',
            'format' => 'text',
            'value' => function ($model) {
                return $model->endereco ?? 'N/D';
            },
        ];

        $colunas[] = [
            'attribute' => 'cep',
            'header' => 'CEP',
            'format' => 'text',
            'value' => function ($model) {
                return $model->cep ?? 'N/D';
            },
        ];

        $colunas[] = [
            'attribute' => 'latitude',
            'header' => 'Latitude',
        ];

        $colunas[] = [
            'attribute' => 'longitude',
            'header' => 'Longitude',
        ];

        $colunas[] = [
            'attribute' => 'contato_principal',
            'header' => 'Contato',
            'format' => 'text',
            'value' => function ($model) {
                return $model->contato ?? 'N/D';
            },
        ];

        /*
        $colunas[] = [
            'attribute' => 'pontuacao',
            'header' => 'Pontuação',
            'format' => 'text',
            'value' => function ($model) {
                return $model->pontuacao ?? 'N/D';
            },
        ];
        */

        return \moonland\phpexcel\Excel::export([
            'isMultipleSheet' => false,
            'models' => $models,
            'columns' => $colunas,
            'fileName' => 'Instalações da ' . $cliente->nome . '.xlsx',
            'asAttachment' => true,
        ]);
    }


    public function actionAnalistas($id, $estado_id = 'todas')
    {

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

        $colors = [
            0 =>  '#1e3a8a',
            1 =>  '#3b82f6',
            2 =>  '#60a5fa',
            3 =>  '#00A1D6',
            4 =>  '#1835B3',
            5 =>  '#8b5cf6',
            6 =>  '#FF6B35',
            7 =>  '#FFD700',
            8 =>  '#00A1D6',
            9 =>  '#1835B3',
            10 =>  '#FF6B35',
        ];


        if ($estado_id != 'null' && $estado_id != 'todas') {

            $listaMunicipiosA = Municipio::find()
                ->select('id')
                ->where([
                    'estado_id' => $estado_id,
                ])
                ->column();

            $listaC = Contexto::find()
                ->select('id')
                ->where([
                    'municipio_id' => $listaMunicipiosA,
                    'active' => 1,
                ])
                ->column();


            $contextos = Contexto::find()
                ->select('id')
                ->where('active=1')
                ->andWhere(['in', 'contexto.id', $listaC])
                ->orderBy('id DESC')
                ->column();

            $analistas = \app\models\User::find()
                ->select(new \yii\db\Expression("user_ceon.name AS 'name', user_ceon.id AS 'id', count(user_has_resource.resource_id) AS 'total'"))
                ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
                ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
                ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
                ->where([
                    'user_has_resource.role' => \app\models\UserHasResource::NV_CP_CONTEXTO_ADM,
                    'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
                    'contexto.active' => Contexto::ATIVO,
                ])
                ->andWhere(['in', 'contexto.id', $contextos])
                ->andWhere(['!=', 'contexto.id', Contexto::ID_VIA_LGPD])
                ->asArray()
                ->orderBy('total DESC')
                ->groupBy('user_ceon.id')
                ->all();
        } else {

            $analistas = \app\models\User::find()
                ->select(new \yii\db\Expression("user_ceon.name AS 'name', user_ceon.id AS 'id', count(user_has_resource.resource_id) AS 'total'"))
                ->join('LEFT JOIN', 'user_has_resource', 'user_ceon.id=user_has_resource.user_id')
                ->join('LEFT JOIN', 'profile', 'user_ceon.id=profile.user_id')
                ->join('LEFT JOIN', 'contexto', 'user_has_resource.resource_id=contexto.id')
                ->where([
                    'user_has_resource.role' => \app\models\UserHasResource::NV_CP_CONTEXTO_ADM,
                    'user_ceon.status' => \app\models\User::STATUS_ACTIVE,
                    'contexto.cliente_id' => $id,
                    'contexto.active' => Contexto::ATIVO,
                ])
                ->andWhere(['!=', 'contexto.id', Contexto::ID_VIA_LGPD])
                ->asArray()
                ->orderBy('total DESC')
                ->groupBy('user_ceon.id')
                ->all();
        }

        $dados = [];



        $total = 0;
        foreach ($analistas as $analista) {
            $total = $total + (int) $analista['total'];
        }

        if ($total == 0) {
            return $dados;
        }

        $i = 0;
        foreach ($analistas as $analista) {

            if (!isset($colors[$i])) {
                $i = 0;
            }

            $dados[] = [
                'name' => $analista['name'],
                'value' => round(($analista['total'] / $total) * 100),
                'color' => $colors[$i],
            ];

            $i++;
        }


        return $dados;
    }

    public function actionStatusquo($id, $estado_id)
    {

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

        $colors = [
            0 =>  '#10b981',
            1 =>  '#f59e0b',
            2 =>  '#f97316',
            3 =>  '#ef4444',
            4 =>  '#1835B3',
            5 =>  '#8b5cf6',
            6 =>  '#FF6B35',
            7 =>  '#FFD700',
            8 =>  '#00A1D6',
            9 =>  '#1835B3',
            10 =>  '#FF6B35',
        ];

        $dados = [];

        if ($estado_id != 'null' && $estado_id != 'todas') {

            $listaMunicipiosA = Municipio::find()
                ->select('id')
                ->where([
                    'estado_id' => $estado_id,
                ])
                ->column();

            $listaC = Contexto::find()
                ->select('id')
                ->where([
                    'municipio_id' => $listaMunicipiosA,
                    'active' => 1,
                ])
                ->column();


            $contextos = Contexto::find()
                ->select('id')
                ->where('active=1')
                ->andWhere(['in', 'contexto.id', $listaC])
                ->orderBy('id DESC')
                ->column();

            $inventarioRespostasStatusQuos = \app\models\InventarioResposta::find()
                ->joinWith(['scope', 'inventarioScope'])
                ->where([
                    'inventario_resposta.inventario_pergunta_id' => \app\models\InventarioPergunta::PERGUNTA_ID_STATUS_QUO,
                    'inventario_resposta.aplica' => \app\models\InventarioResposta::APLICA_SIM,

                    'scope.status' => Scope::ATIVO,
                    'inventario_scope.status' => \app\models\InventarioScope::ATIVO,
                ])
                ->andWhere(['in', 'scope.contexto_id', $contextos])
                ->andWhere(['!=', 'inventario_resposta.status', \app\models\InventarioResposta::INATIVO])
                ->all();
        } else {

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



        $inventarioRespostasDadosStatusQuos = [];
        foreach ($inventarioRespostasStatusQuos as $inventarioRespostasStatusQuo) {
            $inventarioRespostasDadosStatusQuos[$inventarioRespostasStatusQuo->scope->contexto_id] = $inventarioRespostasStatusQuo->alternativas_radiobox;
        }

        $inventarioRespostasDadosAjusteStatusQuos = [];
        foreach ($inventarioRespostasDadosStatusQuos as $kS => $vS) {

            if (!isset($inventarioRespostasDadosAjusteStatusQuos[$vS])) {
                $totalS = 1;
            } else {
                $totalS = $inventarioRespostasDadosAjusteStatusQuos[$vS] + 1;
            }

            $inventarioRespostasDadosAjusteStatusQuos[$vS] = $totalS;
        }

        $total = 0;

        foreach ($inventarioRespostasDadosAjusteStatusQuos as $aS => $bS) {
            $total = $total + (int) $bS;
        }

        if ($total == 0) {
            return $dados;
        }

        $i = 0;

        foreach ($inventarioRespostasDadosAjusteStatusQuos as $aS => $bS) {
            $dados[] = [
                'name' => $aS,
                'value' => round(($bS / $total) * 100),
                'color' => $colors[$i],
            ];

            $i++;
        }

        return $dados;
    }

    public function actionRiscos($id, $estado_id)
    {

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

        $colors = [
            0 =>  '#10b981',
            1 =>  '#f59e0b',
            2 =>  '#f97316',
            3 =>  '#ef4444',
            4 =>  '#1835B3',
            5 =>  '#8b5cf6',
            6 =>  '#FF6B35',
            7 =>  '#FFD700',
            8 =>  '#00A1D6',
            9 =>  '#1835B3',
            10 =>  '#FF6B35',
        ];

        $dados = [];

        if ($estado_id != 'null' && $estado_id != 'todas') {

            $listaMunicipiosA = Municipio::find()
                ->select('id')
                ->where([
                    'estado_id' => $estado_id,
                ])
                ->column();

            $listaC = Contexto::find()
                ->select('id')
                ->where([
                    'municipio_id' => $listaMunicipiosA,
                    'active' => 1,
                ])
                ->column();


            $contextos = Contexto::find()
                ->select('id')
                ->where('active=1')
                ->andWhere(['in', 'contexto.id', $listaC])
                ->orderBy('id DESC')
                ->column();

            $riscoCenarios = \app\modules\performance\models\RiscoCenario::find()
                ->select([
                    'risco_modelo.id as modeloid',
                    'risco_modelo.nome as modelo',
                    'cliente.nome as cliente',
                    'contexto.id as contextoid',
                    'contexto.name as contexto',
                    'vertical.nome as vertical',
                    'risco_cenario.id',
                    'risco_cenario.pontuacao as pontuacao',
                ])
                ->leftJoin('coleta', 'risco_cenario.coleta_vinculo = coleta.id')
                ->leftJoin('risco_modelo', 'risco_cenario.risco_modelo_id = risco_modelo.id')
                ->leftJoin('contexto', 'coleta.contexto_id = contexto.id')
                ->leftJoin('vertical', 'coleta.vertical_id = vertical.id')
                ->leftJoin('cliente', 'contexto.cliente_id = cliente.id')
                ->where([
                    'risco_cenario.status' => \app\modules\performance\models\RiscoCenario::ATIVO,
                    'contexto.active' => \app\modules\performance\models\Contexto::ATIVO,
                ])
                ->andWhere(['in', 'contexto.id', $contextos]);
        } else {


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



        $riscoCenarios = $riscoCenarios
            ->orderBy('risco_cenario.id DESC')
            ->asArray()
            ->all();


        //    Utils::debug($riscoCenarios);


        $riscos = [];
        $cenariosExiste = [];
        $riscoBaixo = 0;
        $riscoModerado = 0;
        $riscoAlto = 0;
        $riscoCritico = 0;

        foreach ($riscoCenarios as $riscoCenario) {

            if (!in_array($riscoCenario['contextoid'], $cenariosExiste)) {
                if ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_BAIXO) {
                    $riscoBaixo++;
                } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_MODERADO) {
                    $riscoModerado++;
                } elseif ($riscoCenario['pontuacao'] <= \app\modules\performance\models\RiscoCenario::VIALGPD_LIMITE_ALTO) {
                    $riscoAlto++;
                } else {
                    $riscoCritico++;
                }
            }
            $cenariosExiste[] = $riscoCenario['contextoid'];
        }

        $total = $riscoBaixo + $riscoModerado + $riscoAlto + $riscoCritico;

        if ($total == 0) {
            return $dados;
        }

        $dados[] = ['name' => 'Baixo', 'value' => round(($riscoBaixo / $total) * 100), 'color' => $colors[0]];
        $dados[] = ['name' => 'Moderado', 'value' => round(($riscoModerado / $total) * 100), 'color' => $colors[1]];
        $dados[] = ['name' => 'Alto', 'value' => round(($riscoAlto / $total) * 100), 'color' => $colors[2]];
        $dados[] = ['name' => 'Crítico', 'value' => round(($riscoCritico / $total) * 100), 'color' => $colors[3]];

        return $dados;
    }

    public function actionCreate()
    {

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


        $model = new Cliente();

        $model->municipio_id = 1;

        $model->contato_nome = 'N/D';

        $model->contato_numero_email = 'N/D';

        $model->contato_comercial = 1;

        $model->status = 1;

        $model->ordem = 100;

        if ($model->load(Yii::$app->request->post())) {
            if ($model->save()) {
                return 'ok';
            } else {
                throw new HttpException(500, json_encode($model->getErrors()));
            }
        }
    }
}
