Untitled

 avatar
unknown
plain_text
6 months ago
138 kB
3
Indexable
<?php

namespace app\modules\supravizio\controllers;

use app\models\DcfAnexos;
use app\models\DcfContratosInstrumentos;
use app\models\DmsAnexos;
use DateTime;
use GuzzleHttp\Exception\InvalidArgumentException;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\QueryParamAuth;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Psr7;
use yii\filters\VerbFilter;
use \kartik\mpdf\Pdf;

use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlMultiHandler;
use MicrosoftAzure\Storage\Blob\BlobRestProxy;
use MicrosoftAzure\Storage\Blob\Models\CreateBlockBlobOptions;
use Ramsey\Uuid\Uuid;
use yii\filters\auth\HttpBearerAuth;

use Yii;
use yii\web\BadRequestHttpException;
use yii\web\Response;
use yii\rest\Controller;
use yii\rest\ActiveController;

class SupraController extends Controller
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;

        $behaviors['authenticator'] = [
            'class' => CompositeAuth::class,
            'authMethods' => [
                HttpBearerAuth::class,
            ],
        ];

        $behaviors['verbs'] = [
            'class' => VerbFilter::className(),
            'actions' => [],
        ];

        return $behaviors;
    }

    public function actionRelacionaFornecedor()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isPost) {
            // Tenta obter os dados da requisição POST
            $dados = Yii::$app->request->post();

            if (isset($dados)) {
                if (is_array($dados)) {
                    // abre o primeiro array
                    foreach ($dados as $v) {
                        // Usar parâmetros vinculados para prevenir injeção de SQL
                        $dgco = filter_var($v['DGCO'], FILTER_SANITIZE_SPECIAL_CHARS);
                        $dgco_fornecedor = filter_var($v['DGFORNECEDOR'], FILTER_SANITIZE_SPECIAL_CHARS);

                        // Validação
                        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
                            return [
                                'status' => 'error',
                                'message' => "Parâmetro 'DGCO' inválido."
                            ];
                        }
                        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco_fornecedor)) {
                            return [
                                'status' => 'error',
                                'message' => "Parâmetro 'DGFORNECEDOR' inválido."
                            ];
                        }

                        Yii::$app->db->createCommand(
                            "INSERT INTO tmp_tb_contrato_fornecedores_rel (dgco, dgco_fornecedor) VALUES (:dgco, :dgco_fornecedor)"
                        )->bindValues([
                            ':dgco' => $dgco,
                            ':dgco_fornecedor' => $dgco_fornecedor
                        ])->execute();
                    }

                    return ['dados' => $dados];
                } else {
                    return [
                        'status' => 'error',
                        'message' => 'Os dados recebidos não são um array.'
                    ];
                }
            } else {
                // Se a string JSON não foi recebida, retornar um erro
                return [
                    'status' => 'error',
                    'message' => 'Nenhuma string JSON recebida.'
                ];
            }
        } else {
            return [
                'error' => 'Método não permitido. Apenas POST é permitido neste endpoint.',
                'requisicao' => $request->method
            ];
        }
    }




    public function actionListaDesignacaoFornecedor()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $dados = Yii::$app->db->createCommand("SELECT dcf_contratos_designacoes.*, dcf_contratos.gescon_nm_dgco as dgco, 
    dcf_contratos.gescon_ds_objeto as objeto, 
        dcf_contratos.dt_inicio_vigencia,dcf_contratos.dt_fim_vigencia,
        DATEDIFF(CURRENT_DATE, dcf_contratos.dt_inicio_vigencia) AS dias_desde_inicio,DATEDIFF(dcf_contratos.dt_fim_vigencia,CURRENT_DATE) AS dias_para_fim ,dcf_contratos.gescon_nm_razao_social as nome_fornecedor
         FROM dicocdb.dcf_contratos_designacoes 
            left join dicocdb.dcf_contratos on dcf_contratos.id_contrato_fornecedor=dcf_contratos_designacoes.tb_contratos_fornecedor_id
            where dcf_contratos_designacoes.status='Vigente' and dcf_contratos.gescon_ds_status IN('CONTRATO_VIGENTE','AGUARDANDO_DESIGNACAO','AGUARDANDO_SUBSIDIOS_DEMANDANTE','CONTRATO_VIGENTE','DESIGNADO','EM_RENOVACAO','NAO_SERA_RENOVADO') and gescon_nm_dgco is not null and tipo_designacao IN('FISCALIZACAO_SERVICO','FISCALIZACAO_ADMINISTRATIVA','FISCALIZACAO_MASTER')AND titular_ou_suplente='titular';")->queryAll();

            return json_encode($dados);
        } else {
            return [
                'error' => 'Método não permitido. Apenas POST é permitido neste endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionBuscarDesignacao(int $matricula)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $dados = Yii::$app->db->createCommand("
    SELECT contrato.*, designacao.*, designacao_gestor.matricula_colaborador AS matricula_gestor_titular, designacao_gestor.nome_colaborador AS nome_gestor_titular
FROM dcf_contratos_designacoes designacao
LEFT JOIN dcf_contratos contrato ON contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id
LEFT JOIN dcf_contratos_designacoes designacao_gestor ON (designacao_gestor.tipo_designacao = 'GESTAO_CONTRATO' AND designacao_gestor.status = 'VIGENTE' AND designacao_gestor.titular_ou_suplente = 'titular' and contrato.id_contrato_fornecedor = designacao_gestor.tb_contratos_fornecedor_id)
WHERE ((((designacao.tipo_designacao = 'GESTAO_CONTRATO' AND designacao.titular_ou_suplente = 'suplente') 
OR (designacao.tipo_designacao <> 'GESTAO_CONTRATO' AND designacao.tipo_designacao <> 'FISCALIZACAO_ADMINISTRATIVA')) 
AND designacao.status = 'vigente') AND designacao.matricula_colaborador = $matricula)
AND (contrato.gescon_ds_status IN ('CONTRATO_VIGENTE', 'EM_RENOVACAO', 'AGUARDANDO_SUBSIDIOS_DEMANDANTE', 'NAO_SERA_RENOVADO') AND contrato.gescon_ds_serv_fisc_comissao = 'N')
GROUP BY id_contrato_fornecedor;
    ")
                ->queryAll();

            return json_encode($dados);
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionBuscarDesignacoesPorDgco(string $dgco, int $matricula)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }


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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $command = Yii::$app->db->createCommand("
        SELECT 
    contrato.gescon_nm_dgco AS dgco, 
    contrato.gescon_ds_objeto AS objeto, 
    contrato.gescon_nm_razao_social AS fornecedor, 
    ds_fs_titular.nome_colaborador AS fiscal_servico_titular, 
    ds_fs_titular.matricula_colaborador AS matricula_fiscal_servico_titular, 
    ds_fs_suplente.nome_colaborador AS fiscal_servico_suplente, 
    ds_fs_suplente.matricula_colaborador AS matricula_fiscal_servico_suplente, 
    ds_fa_titular.nome_colaborador AS fiscal_administrativo_titular, 
    ds_fa_titular.matricula_colaborador AS matricula_fiscal_administrativo_titular, 
    ds_fa_suplente.nome_colaborador AS fiscal_administrativo_suplente, 
    ds_fa_suplente.matricula_colaborador AS matricula_fiscal_administrativo_suplente, 
    ds_an_titular.nome_colaborador AS analista_titular, 
    ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
    ds_an_suplente.nome_colaborador AS analista_suplente, 
    ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
    ds_gs_titular.nome_colaborador AS gestor_titular, 
    ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
    ds_gs_suplente.nome_colaborador AS gestor_suplente, 
    ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente,
    ultima.tipo_designacao,
    ultima.titular_ou_suplente,
    ultima.id as id_designacao,
    MD5(CONCAT_WS(
        '',
        contrato.gescon_nm_dgco, 
        contrato.gescon_ds_objeto, 
        contrato.gescon_nm_razao_social, 
        ds_fs_titular.nome_colaborador, 
        ds_fs_titular.matricula_colaborador, 
        ds_fs_suplente.nome_colaborador, 
        ds_fs_suplente.matricula_colaborador, 
        ds_fa_titular.nome_colaborador, 
        ds_fa_titular.matricula_colaborador, 
        ds_fa_suplente.nome_colaborador, 
        ds_fa_suplente.matricula_colaborador, 
        ds_an_titular.nome_colaborador, 
        ds_an_titular.matricula_colaborador, 
        ds_an_suplente.nome_colaborador, 
        ds_an_suplente.matricula_colaborador, 
        ds_gs_titular.nome_colaborador, 
        ds_gs_titular.matricula_colaborador, 
        ds_gs_suplente.nome_colaborador, 
        ds_gs_suplente.matricula_colaborador,
        ultima.tipo_designacao,
        ultima.titular_ou_suplente,
        ultima.id
    )) AS unique_id
FROM dcf_contratos contrato
LEFT JOIN dcf_contratos_designacoes ds_fs_titular 
    ON ds_fs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_fs_titular.tipo_designacao = 'FISCALIZACAO_SERVICO' 
    AND ds_fs_titular.titular_ou_suplente = 'titular' 
    AND ds_fs_titular.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ds_fs_suplente 
    ON ds_fs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_fs_suplente.tipo_designacao = 'FISCALIZACAO_SERVICO' 
    AND ds_fs_suplente.titular_ou_suplente = 'suplente' 
    AND ds_fs_suplente.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ds_fa_titular 
    ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
    AND ds_fa_titular.titular_ou_suplente = 'titular' 
    AND ds_fa_titular.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ds_fa_suplente 
    ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
    AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
    AND ds_fa_suplente.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ds_an_titular 
    ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
    AND ds_an_titular.titular_ou_suplente = 'titular' 
    AND ds_an_titular.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ds_an_suplente 
    ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
    AND ds_an_suplente.titular_ou_suplente = 'suplente' 
    AND ds_an_suplente.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ds_gs_titular 
    ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
    AND ds_gs_titular.titular_ou_suplente = 'titular' 
    AND ds_gs_titular.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ds_gs_suplente 
    ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
    AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
    AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
    AND ds_gs_suplente.status = 'VIGENTE'
LEFT JOIN dcf_contratos_designacoes ultima 
    ON ultima.status = 'VIGENTE' 
    AND ultima.matricula_colaborador = :matricula
    AND contrato.id_contrato_fornecedor = ultima.tb_contratos_fornecedor_id
WHERE contrato.gescon_nm_dgco = :dgco AND contrato.gescon_ds_serv_fisc_comissao = 'N'
AND (
    ds_fs_titular.matricula_colaborador = :matricula
    OR ds_fs_suplente.matricula_colaborador = :matricula
    OR ds_gs_suplente.matricula_colaborador = :matricula
    OR ds_an_titular.matricula_colaborador = :matricula
    OR ds_an_suplente.matricula_colaborador = :matricula
    OR ds_fa_titular.matricula_colaborador = :matricula
    OR ds_fa_suplente.matricula_colaborador = :matricula
)
    ");

            $command->bindValue(':dgco', $dgco);
            $command->bindValue(':matricula', $matricula);
            $dados = $command->queryAll();


            return json_encode($dados);
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionAtualizarDesignacao(string $dgco, int $matriculaTransferido, int $matriculaDesignado, string $tipoDesignacao, string $titularSuplente, string $numeroOs)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $request = Yii::$app->getRequest();
        $tipoDesignacao = filter_var($tipoDesignacao, FILTER_SANITIZE_SPECIAL_CHARS);
        $titularSuplente = filter_var($titularSuplente, FILTER_SANITIZE_SPECIAL_CHARS);
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);
        $numeroOs = filter_var($numeroOs, FILTER_SANITIZE_SPECIAL_CHARS);
        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

        if ($request->isGet) {


            if ($matriculaTransferido != 0) {
                $transaction = Yii::$app->db->beginTransaction();

                try {
                    // Obtém designação
                    $designacao = Yii::$app->db->createCommand("
                SELECT designacao.*, contrato.gescon_nm_dgco as dgco 
                FROM dcf_contratos_designacoes designacao 
                LEFT JOIN dcf_contratos contrato ON contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id 
                WHERE 
                    designacao.matricula_colaborador = :matriculaTransferido 
                    AND designacao.tipo_designacao = :tipoDesignacao 
                    AND designacao.titular_ou_suplente = :titularSuplente 
                    AND designacao.status = 'VIGENTE' 
                    AND contrato.gescon_nm_dgco = :dgco
            ")
                        ->bindValue(':matriculaTransferido', $matriculaTransferido)
                        ->bindValue(':tipoDesignacao', $tipoDesignacao)
                        ->bindValue(':titularSuplente', $titularSuplente)
                        ->bindValue(':dgco', $dgco)

                        ->queryOne();

                    if ($designacao) {
                        // Atualiza status da designação anterior
                        Yii::$app->db->createCommand("
                    UPDATE dcf_contratos_designacoes 
                    SET status = 'NÃO VIGENTE' 
                    WHERE id = :id
                ")
                            ->bindValue(':id', $designacao['id'])
                            ->execute();

                        // Obtém informações do colaborador
                        $colaborador = Yii::$app->db->createCommand("
                    SELECT * 
                    FROM tb_colaboradores 
                    WHERE matricula = :matriculaDesignado
                ")
                            ->bindValue(':matriculaDesignado', $matriculaDesignado)
                            ->queryOne();

                        if ($colaborador) {
                            // Insere nova designação
                            Yii::$app->db->createCommand("
                        INSERT INTO dcf_contratos_designacoes (
                            tb_contratos_fornecedor_id, id_contrato, tipo_designacao, dt_designacao, 
                            status, nome_colaborador, matricula_colaborador, uor_colaborador, titular_ou_suplente
                        ) 
                        VALUES (
                            :tb_contratos_fornecedor_id, :id_contrato, :tipo_designacao, :dt_designacao, 
                            'VIGENTE', :nome_colaborador, :matricula_colaborador, :uor_colaborador, :titular_ou_suplente
                        )
                    ")
                                ->bindValue(':tb_contratos_fornecedor_id', $designacao['tb_contratos_fornecedor_id'])
                                ->bindValue(':id_contrato', $designacao['id_contrato'])
                                ->bindValue(':tipo_designacao', $designacao['tipo_designacao'])
                                ->bindValue(':dt_designacao', date('Y-m-d'))
                                ->bindValue(':nome_colaborador', $colaborador['nome'])
                                ->bindValue(':matricula_colaborador', $colaborador['matricula'])
                                ->bindValue(':uor_colaborador', $colaborador['uor'])
                                ->bindValue(':titular_ou_suplente', $designacao['titular_ou_suplente'])
                                ->execute();

                            // Confirma a transação
                            $transaction->commit();
                            return json_encode('deu boa');
                        } else {
                            throw new \Exception('Colaborador não encontrado.');
                        }
                    } else {
                        throw new \Exception('Designação não encontrada.');
                    }
                } catch (\Exception $e) {
                    // Reverte a transação em caso de erro
                    $transaction->rollBack();
                    return [
                        'error' => $e->getMessage(),
                        'requisicao' => $request->method,
                    ];
                }
            } else {
                $transaction = Yii::$app->db->beginTransaction();

                // Obtém informações do colaborador
                $colaborador = Yii::$app->db->createCommand("SELECT * FROM tb_colaboradores WHERE matricula = :matriculaDesignado")->bindValue(':matriculaDesignado', $matriculaDesignado)->queryOne();
                $contrato = Yii::$app->db->createCommand("SELECT * FROM dcf_contratos WHERE gescon_nm_dgco = :dgco")->bindValue(':dgco', $dgco)->queryOne();

                if ($colaborador) {
                    // Insere nova designação
                    Yii::$app->db->createCommand("
                    INSERT INTO dcf_contratos_designacoes (
                        tb_contratos_fornecedor_id, id_contrato, tipo_designacao, dt_designacao, 
                        status, nome_colaborador, matricula_colaborador, uor_colaborador, titular_ou_suplente
                    ) 
                    VALUES (
                        :tb_contratos_fornecedor_id, :id_contrato, :tipo_designacao, :dt_designacao, 
                        'VIGENTE', :nome_colaborador, :matricula_colaborador, :uor_colaborador, :titular_ou_suplente
                    )
                ")
                        ->bindValue(':tb_contratos_fornecedor_id', $contrato['id_contrato_fornecedor'])
                        ->bindValue(':id_contrato', 0)
                        ->bindValue(':tipo_designacao', $tipoDesignacao)
                        ->bindValue(':dt_designacao', date('Y-m-d'))
                        ->bindValue(':nome_colaborador', $colaborador['nome'])
                        ->bindValue(':matricula_colaborador', $colaborador['matricula'])
                        ->bindValue(':uor_colaborador', $colaborador['uor'])
                        ->bindValue(':titular_ou_suplente', $titularSuplente)
                        ->execute();

                    // Confirma a transação
                    $transaction->commit();
                    return json_encode('deu boa');
                }
            }
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisição ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    //novos endpoint
    public function actionBuscarDesignacaoComissao(int $matricula)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Consulta os dados da designação e do contrato
            $command = Yii::$app->db->createCommand("
            SELECT 
                contrato.*, 
                designacao.*, 
                designacao_gestor.matricula_colaborador AS matricula_gestor_titular, 
                designacao_gestor.nome_colaborador AS nome_gestor_titular
            FROM dcf_contratos_designacoes designacao
            LEFT JOIN dcf_contratos contrato 
                ON contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id
            LEFT JOIN dcf_contratos_designacoes designacao_gestor 
                ON (designacao_gestor.tipo_designacao = 'GESTAO_CONTRATO' 
                    AND designacao_gestor.status = 'VIGENTE' 
                    AND designacao_gestor.titular_ou_suplente = 'titular' 
                    AND contrato.id_contrato_fornecedor = designacao_gestor.tb_contratos_fornecedor_id)
            WHERE (
                ((designacao.tipo_designacao = 'GESTAO_CONTRATO' AND designacao.titular_ou_suplente = 'suplente') 
                OR (designacao.tipo_designacao <> 'GESTAO_CONTRATO' AND designacao.tipo_designacao <> 'FISCALIZACAO_ADMINISTRATIVA')) 
                AND designacao.status = 'VIGENTE' 
                AND designacao.matricula_colaborador = :matricula
            ) 
            AND (contrato.gescon_ds_status IN ('CONTRATO_VIGENTE', 'EM_RENOVACAO', 'AGUARDANDO_SUBSIDIOS_DEMANDANTE', 'NAO_SERA_RENOVADO') AND contrato.gescon_ds_serv_fisc_comissao = 'S')
            GROUP BY contrato.id_contrato_fornecedor;
        ");
            $command->bindValue(':matricula', $matricula);
            $dados = json_encode($command->queryAll());

            return $dados; // Yii automaticamente converte arrays para JSON quando Response::FORMAT_JSON está definido
        } else {
            Yii::$app->response->statusCode = 405; // Método não permitido
            return [
                'error' => 'Método não permitido. Ausência de dados na requisição ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }


    public function actionBuscarIntervenientesPorDgcoComissao(string $dgco)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição GET
            $command = Yii::$app->db->createCommand("
            SELECT 
                contrato.gescon_nm_dgco AS dgco, 
                contrato.gescon_ds_objeto AS objeto, 
                contrato.gescon_nm_gerencia as nm_gerencia,
                contrato.gescon_nm_razao_social AS fornecedor, 
                ds_fa_titular.nome_colaborador AS fiscal_administrativo_titular, 
                ds_fa_titular.matricula_colaborador AS matricula_fiscal_administrativo_titular, 
                ds_fa_suplente.nome_colaborador AS fiscal_administrativo_suplente, 
                ds_fa_suplente.matricula_colaborador AS matricula_fiscal_administrativo_suplente, 
                ds_an_titular.nome_colaborador AS analista_titular, 
                ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
                ds_an_suplente.nome_colaborador AS analista_suplente, 
                ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
                ds_gs_titular.nome_colaborador AS gestor_titular, 
                ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
                ds_gs_suplente.nome_colaborador AS gestor_suplente, 
                ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente,
                MD5(CONCAT_WS(
                    '',
                    contrato.gescon_nm_dgco, 
                    contrato.gescon_ds_objeto, 
                    contrato.gescon_nm_razao_social, 
                    ds_fa_titular.nome_colaborador, 
                    ds_fa_titular.matricula_colaborador, 
                    ds_fa_suplente.nome_colaborador, 
                    ds_fa_suplente.matricula_colaborador, 
                    ds_an_titular.nome_colaborador, 
                    ds_an_titular.matricula_colaborador, 
                    ds_an_suplente.nome_colaborador, 
                    ds_an_suplente.matricula_colaborador, 
                    ds_gs_titular.nome_colaborador, 
                    ds_gs_titular.matricula_colaborador, 
                    ds_gs_suplente.nome_colaborador, 
                    ds_gs_suplente.matricula_colaborador
                )) AS unique_id
            FROM dcf_contratos contrato
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular 
                ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_titular.titular_ou_suplente = 'titular' 
                AND ds_fa_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente 
                ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_titular 
                ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_titular.titular_ou_suplente = 'titular' 
                AND ds_an_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_suplente 
                ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_suplente.titular_ou_suplente = 'suplente' 
                AND ds_an_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_titular 
                ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_titular.titular_ou_suplente = 'titular' 
                AND ds_gs_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_suplente 
                ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
                AND ds_gs_suplente.status = 'VIGENTE'
            WHERE contrato.gescon_nm_dgco = :dgco 
              AND contrato.gescon_ds_serv_fisc_comissao = 'S'
        ");

            $command->bindValue(':dgco', $dgco);
            $dados = json_encode($command->queryAll());

            return $dados; // Yii automaticamente converte arrays para JSON quando Response::FORMAT_JSON está definido
        } else {
            Yii::$app->response->statusCode = 405; // Método não permitido
            return [
                'error' => 'Método não permitido. Ausência de dados na requisição ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }



    public function actionBuscarFiscaisServicoComissao(string $dgco)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição GET
            $dados = Yii::$app->db->createCommand("
                SELECT contrato.gescon_nm_dgco as dgco, designacao.*
                FROM dcf_contratos_designacoes designacao
                LEFT JOIN dcf_contratos contrato 
                    ON contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id
                WHERE designacao.status = 'VIGENTE' 
                    AND contrato.gescon_nm_dgco = :dgco
                    AND designacao.tipo_designacao = 'FISCALIZACAO_SERVICO'
            ")
                ->bindValue(':dgco', $dgco)
                ->queryAll();

            return json_encode($dados); // Yii automaticamente converte arrays para JSON quando Response::FORMAT_JSON está definido
        } else {
            Yii::$app->response->statusCode = 405; // Método não permitido
            return [
                'error' => 'Método não permitido. Ausência de dados na requisição ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionBuscarIntervenientesPorDgco(string $dgco)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }


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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $command = Yii::$app->db->createCommand("SELECT 
                                                        contrato.gescon_nm_dgco AS dgco, 
                                                        contrato.gescon_ds_objeto AS objeto, 
                                                        contrato.gescon_nm_gerencia as nm_gerencia,
                                                        contrato.gescon_nm_razao_social AS fornecedor, 
                                                        contrato.gescon_ds_serv_fisc_comissao AS fiscalizado_comissao,
                                                        ds_fa_titular.nome_colaborador AS fiscal_master_titular, 
                                                        ds_fa_titular.matricula_colaborador AS matricula_fiscal_master_titular, 
                                                        ds_fa_suplente.nome_colaborador AS fiscal_master_suplente, 
                                                        ds_fa_suplente.matricula_colaborador AS matricula_fiscal_master_suplente, 
                                                        ds_fa_titular2.nome_colaborador AS fiscal_administrativo_titular, 
                                                        ds_fa_titular2.matricula_colaborador AS matricula_fiscal_administrativo_titular, 
                                                        ds_fa_suplente2.nome_colaborador AS fiscal_administrativo_suplente, 
                                                        ds_fa_suplente2.matricula_colaborador AS matricula_fiscal_administrativo_suplente, 
                                                        ds_an_titular.nome_colaborador AS analista_titular, 
                                                        ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
                                                        ds_an_suplente.nome_colaborador AS analista_suplente, 
                                                        ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
                                                        ds_gs_titular.nome_colaborador AS gestor_titular, 
                                                        ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
                                                        ds_gs_suplente.nome_colaborador AS gestor_suplente, 
                                                        ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente,
                                                        MD5(CONCAT_WS(
                                                            '',
                                                            contrato.gescon_nm_dgco, 
                                                            contrato.gescon_ds_objeto, 
                                                            contrato.gescon_nm_razao_social, 
                                                            ds_fa_titular.nome_colaborador, 
                                                            ds_fa_titular.matricula_colaborador, 
                                                            ds_fa_suplente.nome_colaborador, 
                                                            ds_fa_suplente.matricula_colaborador, 
                                                            ds_an_titular.nome_colaborador, 
                                                            ds_an_titular.matricula_colaborador, 
                                                            ds_an_suplente.nome_colaborador, 
                                                            ds_an_suplente.matricula_colaborador, 
                                                            ds_gs_titular.nome_colaborador, 
                                                            ds_gs_titular.matricula_colaborador, 
                                                            ds_gs_suplente.nome_colaborador, 
                                                            ds_gs_suplente.matricula_colaborador
                                                        )) AS unique_id
                                                    FROM dcf_contratos contrato
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_titular 
                                                        ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
                                                        AND ds_fa_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_fa_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_suplente 
                                                        ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
                                                        AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_fa_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_titular2 
                                                        ON ds_fa_titular2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_titular2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                                                        AND ds_fa_titular2.titular_ou_suplente = 'titular' 
                                                        AND ds_fa_titular2.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_suplente2 
                                                        ON ds_fa_suplente2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_suplente2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                                                        AND ds_fa_suplente2.titular_ou_suplente = 'suplente' 
                                                        AND ds_fa_suplente2.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_an_titular 
                                                        ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
                                                        AND ds_an_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_an_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_an_suplente 
                                                        ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
                                                        AND ds_an_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_an_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_gs_titular 
                                                        ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
                                                        AND ds_gs_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_gs_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_gs_suplente 
                                                        ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
                                                        AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_gs_suplente.status = 'VIGENTE'
                                                    WHERE contrato.gescon_nm_dgco = :dgco;
            ");

            $command->bindValue(':dgco', $dgco);
            $dados = $command->queryAll();


            return json_encode($dados);
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionBuscarContratos(string $dgco)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $dados = Yii::$app->db->createCommand("SELECT id_contrato_fornecedor, gescon_nm_dgco,gescon_ds_status FROM dcf_contratos WHERE gescon_nm_dgco = '$dgco';")->queryAll();

            return json_encode($dados);
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }


    public function actionInserirContrato(string $dgco, string $nomeFantasia)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);
        $nomeFantasia = filter_var($nomeFantasia, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            Yii::$app->db->createCommand("INSERT INTO dcf_contratos (gescon_nm_dgco, gescon_ds_status, gescon_oid, gescon_id_contrato, gescon_nm_razao_social, gescon_ds_serv_fisc_comissao) VALUES('$dgco', 'CONTRATO_VIGENTE', '', 0, '$nomeFantasia', 'N');")->queryOne();

            return json_encode([true]);
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionInvalidarDesignacao(string $dgco = null, int $matriculaTransferido = null, string $titularSuplente = null)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);
        $titularSuplente = filter_var($titularSuplente, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }


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

        if ($request->isGet) {


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

            try {
                // Obtém designação
                $designacao = Yii::$app->db->createCommand("SELECT designacao.*, contrato.gescon_nm_dgco as dgco  FROM dcf_contratos_designacoes designacao LEFT JOIN dcf_contratos contrato ON contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id  WHERE designacao.matricula_colaborador = :matriculaTransferido AND designacao.tipo_designacao = 'FISCALIZACAO_SERVICO' AND designacao.titular_ou_suplente = :titularSuplente AND designacao.status = 'VIGENTE' AND contrato.gescon_nm_dgco = :dgco")->bindValue(':matriculaTransferido', $matriculaTransferido)->bindValue(':titularSuplente', $titularSuplente)->bindValue(':dgco', $dgco)->queryOne();

                if ($designacao) {
                    // Atualiza status da designação anterior
                    Yii::$app->db->createCommand("UPDATE dcf_contratos_designacoes SET status = 'NÃO VIGENTE' WHERE id = :id")->bindValue(':id', $designacao['id'])->execute();

                    // Confirma a transação
                    $transaction->commit();
                    return json_encode('deu boa');
                } else {
                    throw new \Exception('Designação não encontrada.');
                }
            } catch (\Exception $e) {
                // Reverte a transação em caso de erro
                $transaction->rollBack();
                return [
                    'error' => $e->getMessage(),
                    'requisicao' => $request->method,
                ];
            }
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisição ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionBuscarDesignacoesGestor(int $matricula)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $dados = Yii::$app->db->createCommand("SELECT contrato.*, designacao.*, designacao_gestor.matricula_colaborador AS matricula_gestor_titular, designacao_gestor.nome_colaborador AS nome_gestor_titular
                                                    FROM dcf_contratos_designacoes designacao
                                                    LEFT JOIN dcf_contratos contrato ON contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id
                                                    LEFT JOIN dcf_contratos_designacoes designacao_gestor ON (designacao_gestor.tipo_designacao = 'GESTAO_CONTRATO' AND designacao_gestor.status = 'VIGENTE' AND designacao_gestor.titular_ou_suplente = 'titular' AND contrato.id_contrato_fornecedor = designacao_gestor.tb_contratos_fornecedor_id)
                                                    WHERE designacao.matricula_colaborador = :matricula AND designacao.tipo_designacao = 'GESTAO_CONTRATO' AND designacao.status = 'VIGENTE' AND designacao.titular_ou_suplente = 'titular' AND contrato.gescon_ds_status IN ('CONTRATO_VIGENTE', 'EM_RENOVACAO', 'AGUARDANDO_SUBSIDIOS_DEMANDANTE', 'NAO_SERA_RENOVADO');")->bindValue(':matricula', $matricula);

            $resultado = $dados->queryAll();

            return json_encode($resultado); // Retorna o array de resultados diretamente
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionAtualizarGestores(int $page = 1)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Calcula o offset com base no número da página
            $limit = 100;
            $offset = ($page - 1) * $limit;

            // Ajusta a consulta SQL para incluir paginação
            $dados = Yii::$app->db->createCommand("
            SELECT 
                contrato.gescon_nm_dgco AS dgco, 
                contrato.gescon_ds_objeto AS objeto, 
                contrato.gescon_nm_razao_social AS fornecedor, 
                contrato.gescon_ds_serv_fisc_comissao AS fiscalizado_comissao,
                ds_fa_titular.nome_colaborador AS fiscal_master_titular, 
                ds_fa_titular.matricula_colaborador AS matricula_fiscal_master_titular, 
                ds_fa_suplente.nome_colaborador AS fiscal_master_suplente, 
                ds_fa_suplente.matricula_colaborador AS matricula_fiscal_master_suplente, 
                ds_an_titular.nome_colaborador AS analista_titular, 
                ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
                ds_an_suplente.nome_colaborador AS analista_suplente, 
                ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
                ds_gs_titular.nome_colaborador AS gestor_titular, 
                ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
                ds_gs_titular.uor_colaborador AS uor_gestor_titular, 
                ds_gs_suplente.nome_colaborador AS gestor_suplente, 
                ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente,
                MD5(CONCAT_WS(
                    '',
                    contrato.gescon_nm_dgco, 
                    contrato.gescon_ds_objeto, 
                    contrato.gescon_nm_razao_social, 
                    ds_fa_titular.nome_colaborador, 
                    ds_fa_titular.matricula_colaborador, 
                    ds_fa_suplente.nome_colaborador, 
                    ds_fa_suplente.matricula_colaborador, 
                    ds_an_titular.nome_colaborador, 
                    ds_an_titular.matricula_colaborador, 
                    ds_an_suplente.nome_colaborador, 
                    ds_an_suplente.matricula_colaborador, 
                    ds_gs_titular.nome_colaborador, 
                    ds_gs_titular.matricula_colaborador, 
                    ds_gs_suplente.nome_colaborador, 
                    ds_gs_suplente.matricula_colaborador
                )) AS unique_id
            FROM dcf_contratos contrato
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular 
                ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_titular.titular_ou_suplente = 'titular' 
                AND ds_fa_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente 
                ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_titular 
                ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_titular.titular_ou_suplente = 'titular' 
                AND ds_an_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_suplente 
                ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_suplente.titular_ou_suplente = 'suplente' 
                AND ds_an_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_titular 
                ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_titular.titular_ou_suplente = 'titular' 
                AND ds_gs_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_suplente 
                ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
                AND ds_gs_suplente.status = 'VIGENTE'
            WHERE contrato.gescon_ds_status IN ('CONTRATO_VIGENTE', 'EM_RENOVACAO', 'AGUARDANDO_SUBSIDIOS_DEMANDANTE', 'NAO_SERA_RENOVADO')
            LIMIT :limit OFFSET :offset
        ")
                ->bindValue(':limit', $limit)
                ->bindValue(':offset', $offset);

            $resultado = $dados->queryAll();

            return json_encode($resultado); // Retorna o array de resultados diretamente
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }


    public function actionInserirAlertaGestorTransferido(int $idDesignacao)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST
            $dados = Yii::$app->db->createCommand("SELECT * FROM dcf_alertas_gestores_transferidos WHERE solucionado <> 1 AND id_designacao_gestor_transferido = $idDesignacao;")->queryOne();
            if (!$dados) {
                Yii::$app->db->createCommand("INSERT INTO dcf_alertas_gestores_transferidos (id_designacao_gestor_transferido, data_transferencia) VALUES(:idDesignacao, :dataTransferencia);")->bindValue(':idDesignacao', $idDesignacao)->bindValue(':dataTransferencia', date('y-m-d'))->queryAll();
            }
            return json_encode(true); // Retorna o array de resultados diretamente
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }


    public function actionBuscarContratosSemGestor()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $dados = Yii::$app->db->createCommand("SELECT transferido.id as id_notificacao, designacao.id as id_designacao, transferido.data_transferencia, designacao.*, contrato.*
            FROM dcf_alertas_gestores_transferidos transferido
            left join dcf_contratos_designacoes designacao on designacao.id = transferido.id_designacao_gestor_transferido 
            left join dcf_contratos contrato on contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id 
            WHERE transferido.solucionado <> 1")->queryAll();



            return json_encode($dados); // Retorna o array de resultados diretamente
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionAtualizarGestorContrato(int $idDesignacao, int $idAlerta, int $matriculaNovoGestor)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $designacao = Yii::$app->db->createCommand("SELECT * FROM dcf_contratos_designacoes WHERE id = :idDesignacao;")->bindValue(':idDesignacao', $idDesignacao)->queryOne();
            $alerta = Yii::$app->db->createCommand("SELECT * FROM dcf_alertas_gestores_transferidos WHERE id = :idAlerta;")->bindValue(':idAlerta', $idAlerta)->queryOne();
            $colaborador = Yii::$app->db->createCommand("SELECT * FROM tb_colaboradores WHERE matricula = :matriculaNovoGestor;")->bindValue(':matriculaNovoGestor', $matriculaNovoGestor)->queryOne();

            if (isset($colaborador)) {
                Yii::$app->db->createCommand("UPDATE dcf_contratos_designacoes SET status='NÃO VIGENTE' WHERE id=:idDesignacao;")->bindValue(':idDesignacao', $designacao['id'])->queryOne();
                Yii::$app->db->createCommand("INSERT INTO dcf_contratos_designacoes (tb_contratos_fornecedor_id, id_contrato, tipo_designacao, dt_designacao, status, nome_colaborador, matricula_colaborador, uor_colaborador, titular_ou_suplente) VALUES(" . $designacao['tb_contratos_fornecedor_id'] . ", " . $designacao['id_contrato'] . ", 'GESTAO_CONTRATO', '" . date("Y-m-d") . "', 'vigente', '" . $colaborador['nome'] . "', '" . $colaborador['matricula'] . "', '" . $designacao['uor_colaborador'] . "', 'titular');")->queryOne();
                Yii::$app->db->createCommand("UPDATE dcf_alertas_gestores_transferidos SET solucionado = 1 WHERE id = " . $alerta['id'] . ";")->queryOne();
                return json_encode(true);
            } else {
                return json_encode(true);
            }
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionBuscarDesignacoesFiscalAdministrativo(int $matricula)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $dados = Yii::$app->db->createCommand("SELECT contrato.*, designacao.*
                                                    FROM dcf_contratos_designacoes designacao
                                                    LEFT JOIN dcf_contratos contrato ON contrato.id_contrato_fornecedor = designacao.tb_contratos_fornecedor_id
                                                    WHERE designacao.matricula_colaborador = :matricula AND designacao.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' AND designacao.status = 'VIGENTE' AND contrato.gescon_ds_status IN ('CONTRATO_VIGENTE', 'EM_RENOVACAO', 'AGUARDANDO_SUBSIDIOS_DEMANDANTE', 'NAO_SERA_RENOVADO');")->bindValue(':matricula', $matricula);

            $resultado = $dados->queryAll();

            return json_encode($resultado); // Retorna o array de resultados diretamente
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionBuscarAvaliadoresPorDgcoComissao(string $dgco)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }


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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $command = Yii::$app->db->createCommand("SELECT 
                                                        contrato.gescon_nm_dgco AS dgco, 
                                                        contrato.gescon_ds_objeto AS objeto,
                                                        contrato.gescon_nm_gerencia as nm_gerencia, 
                                                        contrato.gescon_nm_razao_social AS fornecedor, 
                                                        ds_fa_titular.nome_colaborador AS fiscal_master_titular, 
                                                        ds_fa_titular.matricula_colaborador AS matricula_fiscal_master_titular, 
                                                        ds_fa_suplente.nome_colaborador AS fiscal_master_suplente, 
                                                        ds_fa_suplente.matricula_colaborador AS matricula_fiscal_master_suplente, 
                                                        ds_an_titular.nome_colaborador AS analista_titular, 
                                                        ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
                                                        ds_an_suplente.nome_colaborador AS analista_suplente, 
                                                        ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
                                                        ds_gs_titular.nome_colaborador AS gestor_titular, 
                                                        ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
                                                        ds_gs_suplente.nome_colaborador AS gestor_suplente, 
                                                        ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente,
                                                        ds_fa_titular2.nome_colaborador AS fiscal_administrativo_titular, 
                                                        ds_fa_titular2.matricula_colaborador AS matricula_fiscal_administrativo_titular, 
                                                        ds_fa_suplente2.nome_colaborador AS fiscal_administrativo_suplente, 
                                                        ds_fa_suplente2.matricula_colaborador AS matricula_fiscal_administrativo_suplente, 
                                                        MD5(CONCAT_WS(
                                                            '',
                                                            contrato.gescon_nm_dgco, 
                                                            contrato.gescon_ds_objeto, 
                                                            contrato.gescon_nm_razao_social, 
                                                            ds_fa_titular.nome_colaborador, 
                                                            ds_fa_titular.matricula_colaborador, 
                                                            ds_fa_suplente.nome_colaborador, 
                                                            ds_fa_suplente.matricula_colaborador, 
                                                            ds_an_titular.nome_colaborador, 
                                                            ds_an_titular.matricula_colaborador, 
                                                            ds_an_suplente.nome_colaborador, 
                                                            ds_an_suplente.matricula_colaborador, 
                                                            ds_gs_titular.nome_colaborador, 
                                                            ds_gs_titular.matricula_colaborador, 
                                                            ds_gs_suplente.nome_colaborador, 
                                                            ds_gs_suplente.matricula_colaborador
                                                        )) AS unique_id
                                                    FROM dcf_contratos contrato
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_titular 
                                                        ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
                                                        AND ds_fa_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_fa_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_suplente 
                                                        ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
                                                        AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_fa_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_an_titular 
                                                        ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
                                                        AND ds_an_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_an_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_an_suplente 
                                                        ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
                                                        AND ds_an_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_an_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_gs_titular 
                                                        ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
                                                        AND ds_gs_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_gs_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_gs_suplente 
                                                        ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
                                                        AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_gs_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_titular2 
                                                        ON ds_fa_titular2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_titular2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                                                        AND ds_fa_titular2.titular_ou_suplente = 'titular' 
                                                        AND ds_fa_titular2.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_suplente2 
                                                        ON ds_fa_suplente2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_suplente2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                                                        AND ds_fa_suplente2.titular_ou_suplente = 'suplente' 
                                                        AND ds_fa_suplente2.status = 'VIGENTE'
                                                    WHERE contrato.gescon_nm_dgco = :dgco AND contrato.gescon_ds_serv_fisc_comissao = 'S';
            ");

            $command->bindValue(':dgco', $dgco);
            $dados = $command->queryAll();


            return json_encode($dados);
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }



    public function actionBuscarAvaliadoresPorDgco(string $dgco)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }


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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST

            $command = Yii::$app->db->createCommand("SELECT 
                                                        contrato.gescon_nm_dgco AS dgco, 
                                                        contrato.gescon_ds_objeto AS objeto, 
                                                        contrato.gescon_nm_gerencia as nm_gerencia,
                                                        contrato.gescon_nm_razao_social AS fornecedor, 
                                                        contrato.gescon_ds_serv_fisc_comissao AS fiscalizado_comissao,
                                                        ds_fa_titular.nome_colaborador AS fiscal_master_titular, 
                                                        ds_fa_titular.matricula_colaborador AS matricula_fiscal_master_titular, 
                                                        ds_fa_suplente.nome_colaborador AS fiscal_master_suplente, 
                                                        ds_fa_suplente.matricula_colaborador AS matricula_fiscal_master_suplente,
                                                        ds_fa_titular2.nome_colaborador AS fiscal_administrativo_titular, 
                                                        ds_fa_titular2.matricula_colaborador AS matricula_fiscal_administrativo_titular, 
                                                        ds_fa_suplente2.nome_colaborador AS fiscal_administrativo_suplente, 
                                                        ds_fa_suplente2.matricula_colaborador AS matricula_fiscal_administrativo_suplente, 
                                                        ds_an_titular.nome_colaborador AS analista_titular, 
                                                        ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
                                                        ds_an_suplente.nome_colaborador AS analista_suplente, 
                                                        ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
                                                        ds_gs_titular.nome_colaborador AS gestor_titular, 
                                                        ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
                                                        ds_gs_suplente.nome_colaborador AS gestor_suplente, 
                                                        ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente,
                                                        ds_fs_titular.nome_colaborador AS fiscal_servico_titular,
                                                        ds_fs_titular.matricula_colaborador AS matricula_fiscal_servico_titular,
                                                        ds_fs_suplente.nome_colaborador AS fiscal_servico_suplente,
                                                        ds_fs_suplente.matricula_colaborador AS matricula_fiscal_servico_suplente,
                                                        MD5(CONCAT_WS(
                                                            '',
                                                            contrato.gescon_nm_dgco, 
                                                            contrato.gescon_ds_objeto, 
                                                            contrato.gescon_nm_razao_social, 
                                                            ds_fa_titular.nome_colaborador, 
                                                            ds_fa_titular.matricula_colaborador, 
                                                            ds_fa_suplente.nome_colaborador, 
                                                            ds_fa_suplente.matricula_colaborador, 
                                                            ds_an_titular.nome_colaborador, 
                                                            ds_an_titular.matricula_colaborador, 
                                                            ds_an_suplente.nome_colaborador, 
                                                            ds_an_suplente.matricula_colaborador, 
                                                            ds_gs_titular.nome_colaborador, 
                                                            ds_gs_titular.matricula_colaborador, 
                                                            ds_gs_suplente.nome_colaborador, 
                                                            ds_gs_suplente.matricula_colaborador
                                                        )) AS unique_id
                                                    FROM dcf_contratos contrato
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_titular 
                                                        ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
                                                        AND ds_fa_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_fa_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_suplente 
                                                        ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
                                                        AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_fa_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_titular2 
                                                        ON ds_fa_titular2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_titular2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                                                        AND ds_fa_titular2.titular_ou_suplente = 'titular' 
                                                        AND ds_fa_titular2.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fa_suplente2 
                                                        ON ds_fa_suplente2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fa_suplente2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                                                        AND ds_fa_suplente2.titular_ou_suplente = 'suplente' 
                                                        AND ds_fa_suplente2.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fs_titular 
                                                        ON ds_fs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fs_titular.tipo_designacao = 'FISCALIZACAO_SERVICO' 
                                                        AND ds_fs_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_fs_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_fs_suplente 
                                                        ON ds_fs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_fs_suplente.tipo_designacao = 'FISCALIZACAO_SERVICO' 
                                                        AND ds_fs_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_fs_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_an_titular 
                                                        ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
                                                        AND ds_an_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_an_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_an_suplente 
                                                        ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
                                                        AND ds_an_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_an_suplente.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_gs_titular 
                                                        ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
                                                        AND ds_gs_titular.titular_ou_suplente = 'titular' 
                                                        AND ds_gs_titular.status = 'VIGENTE'
                                                    LEFT JOIN dcf_contratos_designacoes ds_gs_suplente 
                                                        ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                                                        AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
                                                        AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
                                                        AND ds_gs_suplente.status = 'VIGENTE'
                                                    WHERE contrato.gescon_nm_dgco = :dgco AND contrato.gescon_ds_serv_fisc_comissao = 'N';
            ");

            $command->bindValue(':dgco', $dgco);
            $dados = $command->queryAll();


            return json_encode($dados);
        } else {
            return [
                'error' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }



    public function actionContratosVigentesDcf()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

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

        if ($request->isGet) {
            // Obtém a data atual
            $formatter = Yii::$app->formatter;
            $month = (int)$formatter->asDate('now', 'MM');
            $year = (int)$formatter->asDate('now', 'yyyy');

            // Calcula o trimestre
            $quarter = ceil($month / 3);

            // Executa a consulta no banco de dados
            $dados = Yii::$app->db->createCommand("SELECT gescon_nm_dgco AS dgco, gescon_ds_serv_fisc_comissao AS fiscalizado_comissao, gescon_nm_gerencia AS nm_gerencia, gescon_ds_cat_compra AS cat_compra FROM dcf_contratos WHERE gescon_ds_status IN ('CONTRATO_VIGENTE', 'AGUARDANDO_SUBSIDIOS_DEMANDANTE', 'EM_RENOVACAO', 'NAO_SERA_RENOVADO') AND gescon_ds_cat_compra NOT IN ('CONTRATO CLIENTE') AND gescon_ds_cat_compra NOT LIKE '%outros%';")->queryAll();

            // Adiciona o período e o ano a cada item do resultado
            foreach ($dados as &$dado) {
                $dado['periodo'] = $quarter;
                $dado['ano'] = $year;
            }

            // Retorna o resultado como JSON
            return $dados;
        } else {
            return [
                'error' => 'Método não permitido. Apenas GET é permitido neste endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }

    public function actionInserirAvaliacao(string $dgco, float $nota, int $periodo, int $ano, int $matricula_avaliador, string $tipo_avaliador, string $os)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

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

        if ($request->isGet) {
            // Executa a consulta no banco de dados
            $dadosContrato = Yii::$app->db->createCommand("SELECT id_contrato_fornecedor, gescon_nm_dgco FROM dcf_contratos WHERE gescon_nm_dgco = :dgco;")
                ->bindValue(":dgco", $dgco)
                ->queryOne();

            if (isset($dadosContrato)) {
                // Executa a inserção
                Yii::$app->db->createCommand("INSERT INTO dcf_avaliacoes_trimestrais (id_contrato, nota, periodo, ano, matricula_colaborador, tipo_avaliador, numero_os) VALUES(:idContrato, :nota, :periodo, :ano, :matricula_colaborador, :tipo_avaliador, :numero_os);")
                    ->bindValue(":idContrato", $dadosContrato['id_contrato_fornecedor'])
                    ->bindValue(":nota", $nota)
                    ->bindValue(":periodo", $periodo)
                    ->bindValue(":ano", $ano)
                    ->bindValue(":matricula_colaborador", $matricula_avaliador)
                    ->bindValue(":tipo_avaliador", $tipo_avaliador)
                    ->bindValue(":numero_os", $os)
                    ->execute();

                // Retorna o resultado como JSON
                return json_encode(["success" => true]);
            } else {
                return json_encode([
                    'error' => 'Contrato não encontrado para o DGCO informado.',
                ]);
            }
        } else {
            return json_encode([
                'error' => 'Método não permitido. Apenas GET é permitido neste endpoint.',
                'requisicao' => $request->method,
            ]);
        }
    }


    public function actionGerarDgco()
    {
        //Yii::$app->response->format = Response::FORMAT_JSON;
        if (Yii::$app->request->isPost) {
            $matricula_solicitante = Yii::$app->request->post('matricula_solicitante');
            $motivo = Yii::$app->request->post('motivo');
            $cnpj_cpf = Yii::$app->request->post('cnpj_cpf');
            $tipo = Yii::$app->request->post('tipo', null);
            $nr_os = Yii::$app->request->post('nr_os', null);

            $razao_social = Yii::$app->request->post('razao_social', null);
            $fisica_juridica = Yii::$app->request->post('fisica_juridica', null);

            // Sanitização e validação
            $matricula_solicitante = filter_var($matricula_solicitante, FILTER_VALIDATE_INT);
            $nr_os = $nr_os !== null ? filter_var($nr_os, FILTER_VALIDATE_INT) : null;
            $motivo = filter_var($motivo, FILTER_SANITIZE_SPECIAL_CHARS);
            $cnpj_cpf = filter_var($cnpj_cpf, FILTER_SANITIZE_SPECIAL_CHARS);
            $tipo = filter_var($tipo, FILTER_SANITIZE_SPECIAL_CHARS);

            $razao_social = filter_var($razao_social, FILTER_SANITIZE_SPECIAL_CHARS);
            $fisica_juridica = filter_var($fisica_juridica, FILTER_SANITIZE_SPECIAL_CHARS);

            if ($matricula_solicitante === false || ($nr_os !== null && $nr_os === false)) {
                return [
                    'success' => false,
                    'message' => 'Parâmetros inválidos.'
                ];
            }

            date_default_timezone_set('America/Sao_Paulo');
            $datetime = new DateTime();
            $ano = $datetime->format('Y');

            function preencherZeros($number, $length = 5)
            {
                return str_pad($number, $length, '0', STR_PAD_LEFT);
            }


            $id_fornecedor = 0;
            $fornecedor = Yii::$app->db->createCommand("SELECT * FROM dicocdb.tb_fornecedores WHERE cnpj_cpf = :cnpj_cpf")
                ->bindValue(':cnpj_cpf', $cnpj_cpf)
                ->queryOne();

            if (empty($fornecedor)) {  // Verificando se o fornecedor não existe
                Yii::$app->db->createCommand("INSERT INTO dicocdb.tb_fornecedores (fisica_juridica, razao_social, cnpj_cpf, tipo) VALUES (:fisica_juridica, :razao_social, :cnpj_cpf, :tipo)")
                    ->bindValue(':fisica_juridica', $fisica_juridica)
                    ->bindValue(':razao_social', $razao_social)
                    ->bindValue(':cnpj_cpf', $cnpj_cpf)
                    ->bindValue(':tipo', $tipo)
                    ->execute(); // Usar execute() para executar o comando

                // Pegando o último ID inserido
                $id_fornecedor = Yii::$app->db->getLastInsertID();
            } else {
                $id_fornecedor = $fornecedor['id'];
            }


            $maiorSequencial = Yii::$app->db->createCommand("SELECT MAX(sequencial) as maior_sequencial FROM dicocdb.acervo_dgcos WHERE ano = :ano")
                ->bindValue(':ano', $ano)
                ->queryScalar();

            $novoSequencial = $maiorSequencial == null ? 1 : $maiorSequencial + 1;
            $sequencialComZeros = preencherZeros($novoSequencial);
            $dgco = "$sequencialComZeros/$ano";

            $dadosDgco = Yii::$app->db->createCommand('SELECT * FROM dicocdb.acervo_dgcos WHERE dgco = :dgco')
                ->bindValue(':dgco', $dgco)
                ->queryOne();

            if ($dadosDgco == null) {
                try {
                    $data_solicitacao = date('Y-m-d H:i:s');

                    Yii::$app->db->createCommand("INSERT INTO dicocdb.acervo_dgcos (dgco, sequencial, ano, matricula_solicitante, data_solicitacao, motivo, nr_os, cnpj_cpf, status, tipo, razao_social, fisica_juridica, id_tb_fornecedores) VALUES (:dgco, :sequencial, :ano, :matricula_solicitante, :data_solicitacao, :motivo, :nr_os, :cnpj_cpf, 1, :tipo, :razao_social, :fisica_juridica, :id_fornecedor)")
                        ->bindValue(':dgco', $dgco)
                        ->bindValue(':sequencial', $novoSequencial)
                        ->bindValue(':ano', $ano)
                        ->bindValue(':matricula_solicitante', $matricula_solicitante)
                        ->bindValue(':data_solicitacao', $data_solicitacao)
                        ->bindValue(':motivo', $motivo)
                        ->bindValue(':nr_os', $nr_os)
                        ->bindValue(':cnpj_cpf', $cnpj_cpf)
                        ->bindValue(':tipo', $tipo)
                        ->bindValue(':fisica_juridica', $fisica_juridica)
                        ->bindValue(':razao_social', $razao_social)
                        ->bindValue(':id_fornecedor', $id_fornecedor)
                        ->execute();

                    return [
                        'success' => true,
                        'message' => 'DGCO gerado com sucesso!',
                        'maiorSequencial' => $novoSequencial,
                        'ano' => $ano,
                        'dgco' => $dgco,
                        'matricula_solicitante' => $matricula_solicitante
                    ];
                } catch (\Exception $e) {
                    return [
                        'success' => false,
                        'message' => 'Erro ao inserir no banco de dados: ' . $e->getMessage(),
                        'maiorSequencial' => $novoSequencial,
                        'ano' => $ano,
                        'dgco' => $dgco
                    ];
                }
            } else {
                return [
                    'success' => false,
                    'message' => 'DGCO já existe.',
                    'maiorSequencial' => $novoSequencial,
                    'ano' => $ano,
                    'dgco' => $dgco
                ];
            }
        } else {
            return [
                'success' => false,
                'message' => 'A requisição deve ser apenas através do método POST.'
            ];
        }
    }


    public function actionAtualizarDgcoProcessoDilic(string $dgco, string $os)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);
        $os = filter_var($os, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST
            $dados = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dil_tb_processo_contratacao WHERE os_supra_dgco = :os;")->bindValue(':os', $os)->queryOne();

            if ($dados) {

                Yii::$app->db->createCommand("UPDATE dicocdb.dil_tb_processo_contratacao SET numero_dgco = :dgco WHERE os_supra_dgco = :os;")
                    ->bindValue(':os', $os)
                    ->bindValue(':dgco', $dgco)
                    ->execute();

                $dados = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dil_tb_processo_contratacao WHERE numero_dgco = :dgco;")
                    ->bindValue(':dgco', $dgco)
                    ->queryOne();
                return [
                    'error' => false,
                    'message' => 'Processo atualizado com sucesso.',
                    'processo' => $dados,
                ];
            } else {
                return [
                    'error' => true,
                    'message' => 'Processo não localizado.',
                    'os' => $os,
                ];
            }
        } else {
            return [
                'error' => true,
                'message' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }


    public function actionAtualizarSituacao(string $dgco, string $status)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;


        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);
        $status = filter_var($status, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

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

        if ($request->isGet) {
            // Tenta obter os dados da requisição POST
            $dados = Yii::$app->db->createCommand("SELECT contrato.* FROM dcf_contratos contrato WHERE gescon_nm_dgco = :dgco;")->bindValue(':dgco', $dgco)->queryOne();

            if ($dados) {

                Yii::$app->db->createCommand("UPDATE dcf_contratos SET gescon_ds_status = :status WHERE gescon_nm_dgco = :dgco;")
                    ->bindValue(':status', $status)
                    ->bindValue(':dgco', $dgco)
                    ->execute();

                $dados = Yii::$app->db->createCommand("SELECT contrato.* FROM dcf_contratos contrato WHERE gescon_nm_dgco = :dgco;")
                    ->bindValue(':dgco', $dgco)
                    ->queryOne();
                return [
                    'error' => false,
                    'message' => 'Status do contrato atualizado com sucesso.',
                    'contrato' => $dados,
                ];
            } else {
                return [
                    'error' => true,
                    'message' => 'Contrato não localizado.',
                    'dgco' => $dgco,
                ];
            }
        } else {
            return [
                'error' => true,
                'message' => 'Método não permitido. Ausência de dados na requisicao ao endpoint.',
                'requisicao' => $request->method,
            ];
        }
    }



    public function actionInserirOrdemServico(string $dgco, string $numero_chamado)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);
        $numero_chamado = filter_var($numero_chamado, FILTER_SANITIZE_SPECIAL_CHARS);


        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

        if (!Yii::$app->request->isPost) {
            // Verifica se o contrato existe
            $contrato = Yii::$app->db->createCommand("SELECT * FROM dcf_contratos WHERE gescon_nm_dgco = :dgco")
                ->bindValue(':dgco', $dgco)
                ->queryOne();

            // Se o contrato não existir, retorna uma mensagem de erro
            if (!$contrato) {
                return ['success' => false, 'message' => 'Contrato inexistente.'];
            }

            // Define o valor de id_contrato_fornecedor com base no contrato existente
            $id_contrato_fornecedor = $contrato['id_contrato_fornecedor'];

            // Define os valores para a inserção
            $descricao = 'Vinculação Teste p/ Exibição do Chamado de 200 Dias.';
            $situacao = 0; // Ajuste conforme necessário
            $dataHoraChamado = date('Y-m-d H:i:s');

            // Cria a consulta de inserção
            $command = Yii::$app->db->createCommand("INSERT INTO dcf_chamados_duzentos_dias (id_contrato_fornecedor, numero_chamado, descricao, situacao, data_hora_chamado) VALUES(:id_contrato_fornecedor, :numero_chamado, :descricao, :situacao, :data_hora_chamado)");

            // Adiciona os valores aos parâmetros da consulta
            $command->bindValues([
                ':id_contrato_fornecedor' => $id_contrato_fornecedor,
                ':numero_chamado' => $numero_chamado,
                ':descricao' => $descricao,
                ':situacao' => $situacao,
                ':data_hora_chamado' => $dataHoraChamado,
            ])->execute();

            return ['success' => true, 'message' => 'Obtenção de Dados logrou sucesso.'];
        } else {
            // Requisição não é do tipo POST
            return ['success' => false, 'message' => 'A requisição deve ser apenas através do método GET.'];
        }
    }

    //inserir ordens de serviço encerramento
    public function actionInserirOrdemServicoEncerramento(string $dgco, string $numero_chamado)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);
        $numero_chamado = filter_var($numero_chamado, FILTER_SANITIZE_SPECIAL_CHARS);


        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }

        if (!Yii::$app->request->isPost) {
            // Verifica se o contrato existe
            $contrato = Yii::$app->db->createCommand("SELECT * FROM dcf_contratos WHERE gescon_nm_dgco = :dgco")
                ->bindValue(':dgco', $dgco)
                ->queryOne();

            // Se o contrato não existir, retorna uma mensagem de erro
            if (!$contrato) {
                return ['success' => false, 'message' => 'Contrato inexistente.'];
            }

            // Define o valor de id_contrato_fornecedor com base no contrato existente
            $id_contrato_fornecedor = $contrato['id_contrato_fornecedor'];

            // Define os valores para a inserção
            $descricao = 'Vinculação Teste p/ Exibição do Chamado de 200 Dias.';
            $situacao = 0; // Ajuste conforme necessário
            $dataHoraChamado = date('Y-m-d H:i:s');

            // Cria a consulta de inserção
            $command = Yii::$app->db->createCommand("INSERT INTO dcf_chamados_encerramento (id_contrato_fornecedor, numero_chamado, descricao, situacao, data_hora_chamado) VALUES(:id_contrato_fornecedor, :numero_chamado, :descricao, :situacao, :data_hora_chamado)");

            // Adiciona os valores aos parâmetros da consulta
            $command->bindValues([
                ':id_contrato_fornecedor' => $id_contrato_fornecedor,
                ':numero_chamado' => $numero_chamado,
                ':descricao' => $descricao,
                ':situacao' => $situacao,
                ':data_hora_chamado' => $dataHoraChamado,
            ])->execute();

            return ['success' => true, 'message' => 'Obtenção de Dados logrou sucesso.'];
        } else {
            // Requisição não é do tipo POST
            return ['success' => false, 'message' => 'A requisição deve ser apenas através do método GET.'];
        }
    }




    public function actionConsultarContratosDuzentosDias()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        if (!Yii::$app->request->isPost) {

            $contratos = Yii::$app->db->createCommand("SELECT 
                contrato.*, 
                c200.numero_chamado, 
                DATEDIFF(CURRENT_DATE, contrato.dt_inicio_vigencia) AS dias_desde_inicio, 
                DATEDIFF(contrato.dt_fim_vigencia, CURRENT_DATE) AS dias_para_fim,
                ds_fa_titular.nome_colaborador AS fiscal_master_titular, 
                ds_fa_titular.matricula_colaborador AS matricula_fiscal_master_titular, 
                ds_fa_suplente.nome_colaborador AS fiscal_master_suplente, 
                ds_fa_suplente.matricula_colaborador AS matricula_fiscal_master_suplente, 
                ds_fa_titular2.nome_colaborador AS fiscal_administrativo_titular, 
                ds_fa_titular2.matricula_colaborador AS matricula_fiscal_administrativo_titular, 
                ds_fa_suplente2.nome_colaborador AS fiscal_administrativo_suplente, 
                ds_fa_suplente2.matricula_colaborador AS matricula_fiscal_administrativo_suplente, 
                ds_fa_titular3.nome_colaborador AS fiscal_servico_titular, 
                ds_fa_titular3.matricula_colaborador AS matricula_fiscal_servico_titular, 
                ds_fa_suplente3.nome_colaborador AS fiscal_servico_suplente, 
                ds_fa_suplente3.matricula_colaborador AS matricula_fiscal_servico_suplente, 
                ds_an_titular.nome_colaborador AS analista_titular, 
                ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
                ds_an_suplente.nome_colaborador AS analista_suplente, 
                ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
                ds_gs_titular.nome_colaborador AS gestor_titular, 
                ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
                ds_gs_suplente.nome_colaborador AS gestor_suplente, 
                ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente
            FROM 
                dcf_contratos contrato
            LEFT JOIN (
                SELECT 
                    id_contrato_fornecedor, 
                    MAX(id) AS max_id_chamado
                FROM 
                    dcf_chamados_duzentos_dias
                WHERE 
                    YEAR(data_hora_chamado) = YEAR(CURRENT_DATE())
                GROUP BY 
                    id_contrato_fornecedor
            ) c200_max ON c200_max.id_contrato_fornecedor = contrato.id_contrato_fornecedor
            LEFT JOIN dcf_chamados_duzentos_dias c200 ON c200.id_contrato_fornecedor = c200_max.id_contrato_fornecedor
                AND c200.id = c200_max.max_id_chamado
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_titular.titular_ou_suplente = 'titular' 
                AND ds_fa_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular2 ON ds_fa_titular2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                AND ds_fa_titular2.titular_ou_suplente = 'titular' 
                AND ds_fa_titular2.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente2 ON ds_fa_suplente2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                AND ds_fa_suplente2.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente2.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular3 ON ds_fa_titular3.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular3.tipo_designacao = 'FISCALIZACAO_SERVICO' 
                AND ds_fa_titular3.titular_ou_suplente = 'titular' 
                AND ds_fa_titular3.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente3 ON ds_fa_suplente3.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente3.tipo_designacao = 'FISCALIZACAO_SERVICO' 
                AND ds_fa_suplente3.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente3.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_titular ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_titular.titular_ou_suplente = 'titular'
                AND ds_an_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_suplente ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_suplente.titular_ou_suplente = 'suplente' 
                AND ds_an_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_titular ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_titular.titular_ou_suplente = 'titular' 
                AND ds_gs_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_suplente ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
                AND ds_gs_suplente.status = 'VIGENTE'
            WHERE 
                contrato.gescon_ds_status IN ('CONTRATO_VIGENTE', 'DESIGNADO')
                AND contrato.gescon_ds_cat_compra NOT IN ('CONTRATO CLIENTE')
                AND contrato.gescon_ds_cat_compra NOT LIKE '%outros/%'
                AND c200.numero_chamado IS NULL
                AND c200.gescon_ds_vedada_renovacao = 'N'
                AND DATEDIFF(contrato.dt_fim_vigencia, CURRENT_DATE) > 0
                AND DATEDIFF(contrato.dt_fim_vigencia, CURRENT_DATE) <= 200;")->queryAll();

            return ['success' => true, 'message' => 'Obtenção de Dados logrou sucesso.', 'contratos' => $contratos];
        } else {
            // Requisição não é do tipo POST
            return ['success' => false, 'message' => 'A requisição deve ser apenas através do método GET.'];
        }
    }

    // esse endpoint é para os casos dos contratos que não podem ser renovados no fluxo de 200 dias
    public function actionConsultarContratosDuzentosDiasVedada()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        if (!Yii::$app->request->isPost) {

            $contratos = Yii::$app->db->createCommand("SELECT 
                contrato.*, 
                c200.numero_chamado, 
                DATEDIFF(CURRENT_DATE, contrato.dt_inicio_vigencia) AS dias_desde_inicio, 
                DATEDIFF(contrato.dt_fim_vigencia, CURRENT_DATE) AS dias_para_fim,
                ds_fa_titular.nome_colaborador AS fiscal_master_titular, 
                ds_fa_titular.matricula_colaborador AS matricula_fiscal_master_titular, 
                ds_fa_suplente.nome_colaborador AS fiscal_master_suplente, 
                ds_fa_suplente.matricula_colaborador AS matricula_fiscal_master_suplente, 
                ds_fa_titular2.nome_colaborador AS fiscal_administrativo_titular, 
                ds_fa_titular2.matricula_colaborador AS matricula_fiscal_administrativo_titular, 
                ds_fa_suplente2.nome_colaborador AS fiscal_administrativo_suplente, 
                ds_fa_suplente2.matricula_colaborador AS matricula_fiscal_administrativo_suplente, 
                ds_fa_titular3.nome_colaborador AS fiscal_servico_titular, 
                ds_fa_titular3.matricula_colaborador AS matricula_fiscal_servico_titular, 
                ds_fa_suplente3.nome_colaborador AS fiscal_servico_suplente, 
                ds_fa_suplente3.matricula_colaborador AS matricula_fiscal_servico_suplente, 
                ds_an_titular.nome_colaborador AS analista_titular, 
                ds_an_titular.matricula_colaborador AS matricula_analista_titular, 
                ds_an_suplente.nome_colaborador AS analista_suplente, 
                ds_an_suplente.matricula_colaborador AS matricula_analista_suplente, 
                ds_gs_titular.nome_colaborador AS gestor_titular, 
                ds_gs_titular.matricula_colaborador AS matricula_gestor_titular, 
                ds_gs_suplente.nome_colaborador AS gestor_suplente, 
                ds_gs_suplente.matricula_colaborador AS matricula_gestor_suplente
            FROM 
                dcf_contratos contrato
            LEFT JOIN (
                SELECT 
                    id_contrato_fornecedor, 
                    MAX(id) AS max_id_chamado
                FROM 
                    dcf_chamados_duzentos_dias
                WHERE 
                    YEAR(data_hora_chamado) = YEAR(CURRENT_DATE())
                GROUP BY 
                    id_contrato_fornecedor
            ) c200_max ON c200_max.id_contrato_fornecedor = contrato.id_contrato_fornecedor
            LEFT JOIN dcf_chamados_encerramento c200 ON c200.id_contrato_fornecedor = c200_max.id_contrato_fornecedor
                AND c200.id = c200_max.max_id_chamado
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular ON ds_fa_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_titular.titular_ou_suplente = 'titular' 
                AND ds_fa_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente ON ds_fa_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente.tipo_designacao = 'FISCALIZACAO_MASTER' 
                AND ds_fa_suplente.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular2 ON ds_fa_titular2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                AND ds_fa_titular2.titular_ou_suplente = 'titular' 
                AND ds_fa_titular2.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente2 ON ds_fa_suplente2.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente2.tipo_designacao = 'FISCALIZACAO_ADMINISTRATIVA' 
                AND ds_fa_suplente2.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente2.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_titular3 ON ds_fa_titular3.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_titular3.tipo_designacao = 'FISCALIZACAO_SERVICO' 
                AND ds_fa_titular3.titular_ou_suplente = 'titular' 
                AND ds_fa_titular3.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_fa_suplente3 ON ds_fa_suplente3.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_fa_suplente3.tipo_designacao = 'FISCALIZACAO_SERVICO' 
                AND ds_fa_suplente3.titular_ou_suplente = 'suplente' 
                AND ds_fa_suplente3.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_titular ON ds_an_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_titular.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_titular.titular_ou_suplente = 'titular'
                AND ds_an_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_an_suplente ON ds_an_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_an_suplente.tipo_designacao = 'ANALISTA_CONTRATO' 
                AND ds_an_suplente.titular_ou_suplente = 'suplente' 
                AND ds_an_suplente.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_titular ON ds_gs_titular.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_titular.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_titular.titular_ou_suplente = 'titular' 
                AND ds_gs_titular.status = 'VIGENTE'
            LEFT JOIN dcf_contratos_designacoes ds_gs_suplente ON ds_gs_suplente.tb_contratos_fornecedor_id = contrato.id_contrato_fornecedor 
                AND ds_gs_suplente.tipo_designacao = 'GESTAO_CONTRATO' 
                AND ds_gs_suplente.titular_ou_suplente = 'suplente' 
                AND ds_gs_suplente.status = 'VIGENTE'
            WHERE 
                contrato.gescon_ds_status IN ('CONTRATO_VIGENTE', 'DESIGNADO')
                AND contrato.gescon_ds_cat_compra NOT IN ('CONTRATO CLIENTE')
                AND contrato.gescon_ds_cat_compra NOT LIKE '%outros/%'
                AND c200.numero_chamado IS NULL
                AND c200.gescon_ds_vedada_renovacao = 'S'
                AND DATEDIFF(contrato.dt_fim_vigencia, CURRENT_DATE) > 0
                AND DATEDIFF(contrato.dt_fim_vigencia, CURRENT_DATE) <= 200;")->queryAll();

            return ['success' => true, 'message' => 'Obtenção de Dados logrou sucesso.', 'contratos' => $contratos];
        } else {
            // Requisição não é do tipo POST
            return ['success' => false, 'message' => 'A requisição deve ser apenas através do método GET.'];
        }
    }

    public function actionBuscarDadosContrato(string $dgco)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        // Sanitização básica: Remover espaços em branco
        $dgco = filter_var($dgco, FILTER_SANITIZE_SPECIAL_CHARS);

        // Validação
        if (!preg_match('/^\d{5}\/\d{4}$/', $dgco)) {
            throw new InvalidArgumentException("Parâmetro 'dgco' inválido.");
        }


        // Verifica se a requisição é do tipo POST
        if (!Yii::$app->request->isPost) {

            if ($dgco != null) {
                $contrato = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos WHERE gescon_nm_dgco = :dgco;")->bindValue(':dgco', $dgco)->queryOne();
                $gestorTitular = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos_designacoes WHERE tipo_designacao = 'GESTAO_CONTRATO' AND titular_ou_suplente = 'titular' AND status = 'VIGENTE' AND tb_contratos_fornecedor_id = :idContrato;")->bindValue(':idContrato', $contrato['id_contrato_fornecedor'])->queryOne();
                $analistaTitular = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos_designacoes WHERE tipo_designacao = 'ANALISTA_CONTRATO' AND titular_ou_suplente = 'titular' AND status = 'VIGENTE' AND tb_contratos_fornecedor_id = :idContrato;")->bindValue(':idContrato', $contrato['id_contrato_fornecedor'])->queryOne();
                $analistaSuplente = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos_designacoes WHERE tipo_designacao = 'ANALISTA_CONTRATO' AND titular_ou_suplente = 'suplente' AND status = 'VIGENTE' AND tb_contratos_fornecedor_id = :idContrato;")->bindValue(':idContrato', $contrato['id_contrato_fornecedor'])->queryOne();

                if ($contrato) {
                    return ['success' => true, 'message' => 'A requisição foi processada com sucesso.', 'contrato' => $contrato, 'analistaSuplente' => $analistaSuplente, 'gestorTitular' => $gestorTitular, 'analistaTitular' => $analistaTitular];
                } else {
                    return ['success' => false, 'message' => 'Contrato não encontrado!'];
                }
            } else {
                return ['success' => false, 'message' => 'Preencha o DGCO!'];
            }
        } else {
            // Requisição não é do tipo POST
            return ['success' => false, 'message' => 'A requisição deve ser apenas através do método POST.'];
        }
    }





    public function actionAtualizarIntervenientesSisccon(string $dgco = null, string $matriculaGestorTitular = null, string $matriculaAnalistaTitular = null, string $matriculaAnalistaSuplente = null)
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        // Verifica se a requisição é do tipo POST
        if (!Yii::$app->request->isPost) {
            throw new BadRequestHttpException('A requisição deve ser apenas através do método POST.');
        }

        if ($dgco === null) {
            return ['success' => false, 'message' => 'Preencha o DGCO!'];
        }

        // Sanitiza a entrada para prevenir XSS
        $dgco = htmlspecialchars($dgco, ENT_QUOTES, 'UTF-8');
        $matriculaGestorTitular = htmlspecialchars($matriculaGestorTitular, ENT_QUOTES, 'UTF-8');
        $matriculaAnalistaTitular = htmlspecialchars($matriculaAnalistaTitular, ENT_QUOTES, 'UTF-8');
        $matriculaAnalistaSuplente = htmlspecialchars($matriculaAnalistaSuplente, ENT_QUOTES, 'UTF-8');

        // Consulta segura ao banco de dados
        $contrato = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos WHERE gescon_nm_dgco = :dgco")
            ->bindValue(':dgco', $dgco)
            ->queryOne();

        if (!$contrato) {
            return ['success' => false, 'message' => 'Contrato não encontrado!'];
        }

        $gestorTitular = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos_designacoes WHERE tipo_designacao = 'GESTAO_CONTRATO' AND titular_ou_suplente = 'titular' AND status = 'VIGENTE' AND tb_contratos_fornecedor_id = :idContrato")
            ->bindValue(':idContrato', $contrato['id_contrato_fornecedor'])
            ->queryOne();

        $analistaTitular = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos_designacoes WHERE tipo_designacao = 'ANALISTA_CONTRATO' AND titular_ou_suplente = 'titular' AND status = 'VIGENTE' AND tb_contratos_fornecedor_id = :idContrato")
            ->bindValue(':idContrato', $contrato['id_contrato_fornecedor'])
            ->queryOne();

        $analistaSuplente = Yii::$app->db->createCommand("SELECT * FROM dicocdb.dcf_contratos_designacoes WHERE tipo_designacao = 'ANALISTA_CONTRATO' AND titular_ou_suplente = 'suplente' AND status = 'VIGENTE' AND tb_contratos_fornecedor_id = :idContrato")
            ->bindValue(':idContrato', $contrato['id_contrato_fornecedor'])
            ->queryOne();

        $this->atualizarDesignacao($matriculaGestorTitular, $gestorTitular, 'GESTAO_CONTRATO', 'titular');
        $this->atualizarDesignacao($matriculaAnalistaTitular, $analistaTitular, 'ANALISTA_CONTRATO', 'titular');
        $this->atualizarDesignacao($matriculaAnalistaSuplente, $analistaSuplente, 'ANALISTA_CONTRATO', 'suplente');

        return [
            'success' => true,
            'message' => 'A requisição foi processada com sucesso.',
            'contrato' => $contrato,
            'analistaSuplente' => $analistaSuplente,
            'gestorTitular' => $gestorTitular,
            'analistaTitular' => $analistaTitular
        ];
    }


    private function atualizarDesignacao(int $novaMatricula, $designacaoAtual, $tipoDesignacao, int $titularOuSuplente)
    {


        $designacao_atual_matricula = intval($designacaoAtual['matricula_colaborador']);

        // Verifica se $numeroOS é um inteiro válido (diferente de 0)
        if ($designacao_atual_matricula > 0) {
            // Uso seguro na consulta SQL

        } else {
            // Lida com o caso de $numeroOS inválido
            throw new \yii\web\BadRequestHttpException('Número de OS inválido.');
        }


        // Verifica se a nova matrícula é diferente da matrícula atual
        if ($novaMatricula != $designacao_atual_matricula) {
            // Busca o colaborador pelo número de matrícula de forma segura
            $colaborador = Yii::$app->db->createCommand("SELECT * FROM dicocdb.tb_colaboradores WHERE matricula = :matricula")
                ->bindValue(':matricula', $novaMatricula, \PDO::PARAM_INT)
                ->queryOne();

            if ($colaborador) {
                // Atualiza o status da designação atual para "NÃO VIGENTE"
                Yii::$app->db->createCommand("UPDATE dicocdb.dcf_contratos_designacoes SET status = 'NÃO VIGENTE' WHERE id = :idDesignacao")
                    ->bindValue(':idDesignacao', $designacaoAtual['id'], \PDO::PARAM_INT)
                    ->execute();

                // Insere uma nova designação com o novo colaborador
                Yii::$app->db->createCommand("INSERT INTO dicocdb.dcf_contratos_designacoes (tb_contratos_fornecedor_id, id_contrato, tipo_designacao, dt_designacao, status, nome_colaborador, matricula_colaborador, uor_colaborador, titular_ou_suplente) VALUES(:tb_contratos_fornecedor_id, :id_contrato, :tipoDesignacao, :dt_designacao, 'VIGENTE', :nome_colaborador, :matricula_colaborador, :uor_colaborador, :titular_ou_suplente)")
                    ->bindValue(':tb_contratos_fornecedor_id', $designacaoAtual['tb_contratos_fornecedor_id'], \PDO::PARAM_INT)
                    ->bindValue(':id_contrato', $designacaoAtual['id_contrato'], \PDO::PARAM_INT)
                    ->bindValue(':tipoDesignacao', $tipoDesignacao, \PDO::PARAM_STR)
                    ->bindValue(':dt_designacao', date('Y-m-d'), \PDO::PARAM_STR)
                    ->bindValue(':nome_colaborador', strtoupper($colaborador['nome']), \PDO::PARAM_STR)
                    ->bindValue(':matricula_colaborador', $colaborador['matricula'], \PDO::PARAM_INT)
                    ->bindValue(':uor_colaborador', $colaborador['uor'], \PDO::PARAM_INT)
                    ->bindValue(':titular_ou_suplente', $titularOuSuplente, \PDO::PARAM_INT)
                    ->execute();
            }
        }
    }







































 // Envio de Anexos:
 public function actionDmsRetornarContratosAnexo($id_instrumento_vinculado)
 {
     // Obtenha a conexão oracle configurada
     $connection = \Yii::$app->gescon;

     try {
         // Teste a conexão
         $connection->open();

         // Realiza o select
         $results = $connection->createCommand("SELECT * FROM GESCON.CONTRATO_ANEXO WHERE id_instrumento_vinculado = " . $id_instrumento_vinculado)->queryAll();

         // Retornar os resultados com o campo 'arquivo' convertido
         return ['success' => true, 'data' => $results];
     } catch (\Exception $e) {
         return json_encode(['success' => false, 'error' => $e->getMessage()]);
     }
 }

 public function actionDmsRetornarAnexoAnexoInfo($id_contrato_anexo)
 {
     // Obtenha a conexão oracle configurada
     $connection = \Yii::$app->gescon;


     // Realiza o select com LIMIT 1 e obtém apenas uma linha
     $result = $connection->createCommand("SELECT * FROM GESCON.CONTRATO_ANEXO_ANEXO_INFO WHERE id_contrato_anexo = " . $id_contrato_anexo)->queryAll();

     // Retorna o resultado
     return ['success' => true, 'data' => $result];
 }

 public function actionDmsRetornarAnexosInfoGescon($id_anexo_info)
 {
     // Obtenha a conexão oracle configurada
     $connection = \Yii::$app->gescon;

     // Realiza o select
     $results = $connection->createCommand("SELECT * FROM GESCON.ANEXO_INFO WHERE id_anexo_info = " . $id_anexo_info)->queryAll();

     // Retorna o resultado
     return ['success' => true, 'data' => $results];
 }



 public function actionDmsEnviarArquivo($id_anexo, $id_contrato_fornecedor, $id_instrumento, $nome, $extensao, $dt_inclusao, $id_func_inclusao)
 {
     $connection = \Yii::$app->gescon;

     try {
         // Conectando ao banco de dados
         $connection->open();
         Yii::debug("Conexão com o banco de dados aberta.");

         // Executa a consulta para obter o arquivo
         $result = $connection->createCommand("SELECT arquivo FROM GESCON.ANEXO WHERE id_anexo = :id")
             ->bindValue(':id', $id_anexo)
             ->queryOne();

         $funcionarioResponsavelAnexo = $connection->createCommand("SELECT * FROM GESCON.FUNCIONARIO WHERE id = " . $id_func_inclusao)->queryAll();
         $matriculaFuncionarioResponsavelAnexo = $funcionarioResponsavelAnexo ? $funcionarioResponsavelAnexo[0]['matricula'] : 0;


         // Converter dt_inclusao para o formato YYYY-MM-DD
         $dataConvertida = DateTime::createFromFormat('d-M-y', strtoupper($dt_inclusao));
         if (!$dataConvertida) {
             throw new \Exception("Formato de data inválido: {$dt_inclusao}");
         }
         $dataFormatada = $dataConvertida->format('Y-m-d');


         Yii::debug("Resultado da consulta: " . print_r($result, true));

         if (!$result || !isset($result['arquivo'])) {
             throw new \Exception('Arquivo não encontrado.');
         }

         // Obtém o arquivo do resultado da consulta
         $fileResource = $result['arquivo'];

         // Gera um UUID para o novo anexo
         $uuid = Uuid::uuid4()->toString();

         // Cria a instância do modelo DcfAnexos
         $model = new DmsAnexos();
         $model->id_dilic_demanda = $id_contrato_fornecedor;
         $model->id_anexo_gescon = $id_anexo;
         $model->id_dipli_demanda = $id_contrato_fornecedor; // Supondo que seja o mesmo
         $model->id_instrumento = $id_instrumento; // Supondo que seja o mesmo
         $model->id_dil_tb_processo_contratacao = $id_instrumento; // Supondo que seja o mesmo
         $model->id_dipli_demanda = $id_contrato_fornecedor; // Supondo que seja o mesmo
         $model->data_hora_insercao = $dataFormatada;
         $model->extensao = $extensao;
         $model->nome = $nome; // Nome do arquivo
         $model->uuid = $uuid;
         $model->st_blob = 'portalgesuc'; // Defina o container adequado
         $model->matricula_condutor = $matriculaFuncionarioResponsavelAnexo;
         $model->atividade_do_anexo = 'Importado do Gescon';
         $model->observacao = 'Importado do Gescon';

         // Salva o modelo antes do upload
         if ($model->save()) {
             // Conexão com o serviço de Blob Storage
             $azureConfig = require Yii::getAlias('@app/config/azure.php');

             $connectionString = "DefaultEndpointsProtocol=https;AccountName={$azureConfig['account_name']};AccountKey={$azureConfig['account_key']};EndpointSuffix=core.windows.net";

             $blobClient = BlobRestProxy::createBlobService($connectionString);
             $contentType = 'application/octet-stream'; // Use conforme necessário
             $options = new CreateBlockBlobOptions();
             $options->setContentType($contentType);

             // Converte o arquivo para um fluxo ou string
             // Caso o arquivo seja um recurso
             if (is_resource($fileResource)) {
                 // Se você estiver lidando com um recurso, use um buffer
                 $fileContent = stream_get_contents($fileResource);
             } else {
                 // Se for uma string, você pode usar diretamente
                 $fileContent = $fileResource; // Ajuste se necessário
             }

             // Salva o arquivo no Azure Blob Storage
             $blobName = $nome; // Nome único para o blob
             $blobClient->createBlockBlob($model->st_blob, $blobName, $fileContent, $options);

             // Se você precisa redirecionar ou retornar um sucesso
             Yii::$app->getSession()->setFlash('success', 'Arquivo renderizado e salvo com sucesso!');
             return ['success' => true];
         } else {
             throw new \Exception('Erro ao salvar o modelo de anexo: ' . implode(', ', $model->getFirstErrors()));
             return ['success' => true];
         }
     } catch (\Throwable $th) {
         Yii::$app->getSession()->setFlash('error', 'Erro ao tentar renderizar o arquivo: ' . $th->getMessage());
         return ['success' => false];
         // return $th->getMessage(); // Exibe uma página de erro customizada
     }
 }















    // Envio de Anexos:
    public function actionRetornarContratosAnexo($id_instrumento_vinculado)
    {
        // Obtenha a conexão oracle configurada
        $connection = \Yii::$app->gescon;

        try {
            // Teste a conexão
            $connection->open();

            // Realiza o select
            $results = $connection->createCommand("SELECT * FROM GESCON.CONTRATO_ANEXO WHERE id_instrumento_vinculado = " . $id_instrumento_vinculado)->queryAll();

            // Retornar os resultados com o campo 'arquivo' convertido
            return ['success' => true, 'data' => $results];
        } catch (\Exception $e) {
            return json_encode(['success' => false, 'error' => $e->getMessage()]);
        }
    }

    public function actionRetornarAnexoAnexoInfo($id_contrato_anexo)
    {
        // Obtenha a conexão oracle configurada
        $connection = \Yii::$app->gescon;


        // Realiza o select com LIMIT 1 e obtém apenas uma linha
        $result = $connection->createCommand("SELECT * FROM GESCON.CONTRATO_ANEXO_ANEXO_INFO WHERE id_contrato_anexo = " . $id_contrato_anexo)->queryAll();

        // Retorna o resultado
        return ['success' => true, 'data' => $result];
    }

    public function actionRetornarAnexosInfoGescon($id_anexo_info)
    {
        // Obtenha a conexão oracle configurada
        $connection = \Yii::$app->gescon;

        // Realiza o select
        $results = $connection->createCommand("SELECT * FROM GESCON.ANEXO_INFO WHERE id_anexo_info = " . $id_anexo_info)->queryAll();

        // Retorna o resultado
        return ['success' => true, 'data' => $results];
    }



    public function actionEnviarArquivo($id_anexo, $id_contrato_fornecedor, $id_instrumento, $nome, $extensao, $dt_inclusao, $id_func_inclusao)
    {
        $connection = \Yii::$app->gescon;

        try {
            // Conectando ao banco de dados
            $connection->open();
            Yii::debug("Conexão com o banco de dados aberta.");

            // Executa a consulta para obter o arquivo
            $result = $connection->createCommand("SELECT arquivo FROM GESCON.ANEXO WHERE id_anexo = :id")
                ->bindValue(':id', $id_anexo)
                ->queryOne();

            $funcionarioResponsavelAnexo = $connection->createCommand("SELECT * FROM GESCON.FUNCIONARIO WHERE id = " . $id_func_inclusao)->queryAll();
            $matriculaFuncionarioResponsavelAnexo = $funcionarioResponsavelAnexo ? $funcionarioResponsavelAnexo[0]['matricula'] : 0;


            // Converter dt_inclusao para o formato YYYY-MM-DD
            $dataConvertida = DateTime::createFromFormat('d-M-y', strtoupper($dt_inclusao));
            if (!$dataConvertida) {
                throw new \Exception("Formato de data inválido: {$dt_inclusao}");
            }
            $dataFormatada = $dataConvertida->format('Y-m-d');


            Yii::debug("Resultado da consulta: " . print_r($result, true));

            if (!$result || !isset($result['arquivo'])) {
                throw new \Exception('Arquivo não encontrado.');
            }

            // Obtém o arquivo do resultado da consulta
            $fileResource = $result['arquivo'];

            // Gera um UUID para o novo anexo
            $uuid = Uuid::uuid4()->toString();

            // Cria a instância do modelo DcfAnexos
            $model = new DcfAnexos();
            $model->id_dilic_demanda = $id_contrato_fornecedor;
            $model->id_anexo_gescon = $id_anexo;
            $model->id_dipli_demanda = $id_contrato_fornecedor; // Supondo que seja o mesmo
            $model->id_instrumento = $id_instrumento; // Supondo que seja o mesmo
            $model->id_dil_tb_processo_contratacao = $id_instrumento; // Supondo que seja o mesmo
            $model->id_dipli_demanda = $id_contrato_fornecedor; // Supondo que seja o mesmo
            $model->data_hora_insercao = $dataFormatada;
            $model->extensao = $extensao;
            $model->nome = $nome; // Nome do arquivo
            $model->uuid = $uuid;
            $model->st_blob = 'portalgesuc-dicof'; // Defina o container adequado
            $model->matricula_condutor = $matriculaFuncionarioResponsavelAnexo;
            $model->atividade_do_anexo = 'Importado do Gescon';
            $model->observacao = 'Importado do Gescon';

            // Salva o modelo antes do upload
            if ($model->save()) {
                // Conexão com o serviço de Blob Storage
                $azureConfig = require Yii::getAlias('@app/config/azure.php');

                $connectionString = "DefaultEndpointsProtocol=https;AccountName={$azureConfig['account_name']};AccountKey={$azureConfig['account_key']};EndpointSuffix=core.windows.net";

                $blobClient = BlobRestProxy::createBlobService($connectionString);
                $contentType = 'application/octet-stream'; // Use conforme necessário
                $options = new CreateBlockBlobOptions();
                $options->setContentType($contentType);

                // Converte o arquivo para um fluxo ou string
                // Caso o arquivo seja um recurso
                if (is_resource($fileResource)) {
                    // Se você estiver lidando com um recurso, use um buffer
                    $fileContent = stream_get_contents($fileResource);
                } else {
                    // Se for uma string, você pode usar diretamente
                    $fileContent = $fileResource; // Ajuste se necessário
                }
 
                // Salva o arquivo no Azure Blob Storage
                $blobName = $nome; // Nome único para o blob
                $blobClient->createBlockBlob($model->st_blob, $blobName, $fileContent, $options);

                // Se você precisa redirecionar ou retornar um sucesso
                Yii::$app->getSession()->setFlash('success', 'Arquivo renderizado e salvo com sucesso!');
                return ['success' => true];
            } else {
                throw new \Exception('Erro ao salvar o modelo de anexo: ' . implode(', ', $model->getFirstErrors()));
                return ['success' => true];
            }
        } catch (\Throwable $th) {
            Yii::$app->getSession()->setFlash('error', 'Erro ao tentar renderizar o arquivo: ' . $th->getMessage());
            return ['success' => false];
            // return $th->getMessage(); // Exibe uma página de erro customizada
        }
    }






    public function actionGetPeriodosDisponiveis($dgco)
    {
        // Busca o id_contrato_fornecedor correspondente ao dgco na tabela dcf_contratos
        $idContratoFornecedor = (new \yii\db\Query())
            ->select('id_contrato_fornecedor')
            ->from('dcf_contratos')
            ->where(['gescon_nm_dgco' => $dgco])
            ->scalar();

        if (!$idContratoFornecedor) {
            return $this->asJson(['error' => 'Contrato não encontrado para o DGCO informado.']);
        }

        // Busca o contrato primitivo
        $contratoPrimitivo = DcfContratosInstrumentos::find()
            ->where([
                'en_tipo_instrumento' => 'CONTRATO_PRIMITIVO',
                'id_contrato_fornecedor' => $idContratoFornecedor,
            ])
            ->orderBy(['id_instrumento' => SORT_ASC])
            ->one();

        // Busca a última prorrogação, se houver
        $ultimaProrrogacao = DcfContratosInstrumentos::find()
            ->joinWith('dcfContratosInstrumentosAditamento')
            ->where([
                'dcf_contratos_instrumentos.en_tipo_instrumento' => 'ADITIVO',
                'dcf_contratos_instrumentos.id_contrato_fornecedor' => $idContratoFornecedor,
                'dcf_contratos_instrumentos_aditamento.tipo_aditamento' => 'PRORROGACAO_VIGENCIA',
            ])
            ->orderBy(['dcf_contratos_instrumentos.id_instrumento' => SORT_DESC])
            ->one();

        // Define as datas de início e fim
        $dt_ini = new \DateTime($contratoPrimitivo->dt_ini_vigencia);
        $dt_fim = new \DateTime($ultimaProrrogacao ? $ultimaProrrogacao->dt_fim_vigencia : $contratoPrimitivo->dt_fim_vigencia);

        // Data atual para comparar se o trimestre já encerrou
        $hoje = new \DateTime();
        $periodos = [];

        // Loop para gerar trimestres encerrados
        while ($dt_ini <= $dt_fim) {
            $ano = (int) $dt_ini->format('Y');
            $trimestre = (int) ceil($dt_ini->format('n') / 3);

            // Calcula o último dia do trimestre atual
            $ultimoDiaTrimestre = (clone $dt_ini)->modify('+3 months')->modify('-1 day');

            // Só adiciona o trimestre se ele já encerrou
            if ($ultimoDiaTrimestre < $hoje) {
                $periodos[] = [
                    'ano' => $ano,
                    'periodo' => $trimestre,
                    'meses' => $this->getMesesPorTrimestre($trimestre, $ano), // Chama a função para obter os meses
                ];
            }

            // Avança para o próximo trimestre
            $dt_ini->modify('+3 months');
        }

        // Consulta períodos que já possuem nota na view
        $periodosAvaliados = (new \yii\db\Query())
            ->select(['ano', 'periodo'])
            ->from('dcf_vw_avaliacoes_medias_trimestre')
            ->where(['id_contrato' => $idContratoFornecedor])
            ->all();

        // Filtra os períodos disponíveis removendo os que já possuem avaliação
        $periodosDisponiveis = array_filter($periodos, function ($periodo) use ($periodosAvaliados) {
            foreach ($periodosAvaliados as $avaliado) {
                if ($avaliado['ano'] == $periodo['ano'] && $avaliado['periodo'] == $periodo['periodo']) {
                    return false;
                }
            }
            return true;
        });

        // Adiciona o DGCO na resposta de cada período disponível
        $resultado = array_map(function ($periodo) use ($dgco) {
            return array_merge($periodo, ['dgco' => $dgco]);
        }, $periodosDisponiveis);

        // Retorna o resultado em JSON
        return $this->asJson(array_values($resultado));
    }

    /**
     * Função para obter os meses correspondentes a um trimestre
     */
    private function getMesesPorTrimestre($trimestre, $ano)
    {
        $meses = [
            1 => 'Jan/Fev/Mar',
            2 => 'Abr/Mai/Jun',
            3 => 'Jul/Ago/Set',
            4 => 'Out/Nov/Dez',
        ];

        return $meses[$trimestre] ?? [];
    }
}
Editor is loading...
Leave a Comment