SET TERM ^ ;

CREATE OR ALTER procedure SPI_WORKFLOW (
    IMODELO_WORKFLOW integer not null,
    ITITULO varchar(200) not null,
    ITELA varchar(10) not null,
    ITIPO char(10) = 'M',
    ICOUNT integer = 0)
returns (
    OWORKFLOW_ID integer)
as
declare variable VALID integer;
declare variable MOSTRAR_T integer;
declare variable PRIMEIRO integer;
declare variable DESCRICAO varchar(1000);
declare variable CHAVE integer;
declare variable WORKFLOW_SUBTASK_ID integer;
declare variable WV_ID integer;
declare variable WV_TITULO varchar(50);
declare variable WV_DESCRICAO varchar(200);
declare variable MOD_WORKFLOW_ID integer;
declare variable MOD_WORKFLOW_TITULO varchar(50);
declare variable MOD_WORKFLOW_DESCRICAO varchar(200);
declare variable MOD_WORKFLOW_TIPO varchar(10);
declare variable DT_INICIAL_P timestamp;
declare variable DT_FINAL_P timestamp;
declare variable WORKFLOW_ID integer;
declare variable WORKFLOW_TAREFA_ID integer;
declare variable WORKFLOW_CAMPO_ID integer;
declare variable TAREFA_ID integer;
declare variable TAREFA_TITULO varchar(50);
declare variable TAREFA_DESCRICAO varchar(200);
declare variable TAREFA_SEQUENCIA integer;
declare variable TAREFA_STATUS varchar(10);
declare variable TAREFA_ORDEM integer;
declare variable TAREFA_PONTO_REPROVACAO integer;
declare variable TAREFA_TEMPO_PREVISTO numeric(18,8);
declare variable TAREFA_TIPO_DESCRICAO varchar(10);
declare variable TAREFA_COR varchar(10);
declare variable CAMPO_ID integer;
declare variable CAMPO_ROTULO varchar(100);
declare variable CAMPO_TIPO varchar(10);
declare variable CAMPO_WORK_SUBTASK_ID integer;
BEGIN

    :VALID = 1;
    :MOSTRAR_T = 0;
    :DESCRICAO = '';

    IF (:ITIPO = 'D') THEN
    BEGIN

        :VALID = 0;


        FOR
            SELECT FIRST 1
                U.ID,
                U.TITULO,
                U.DESCRICAO
    
            FROM TBWORKFLOW U
            WHERE U.ID >  0
            AND U.ID = :IMODELO_WORKFLOW
    
            ORDER BY U.ID, U.TITULO

        INTO
            :WV_ID,
            :WV_TITULO,
            :WV_DESCRICAO

        DO
        BEGIN
            
            IF (COALESCE(:WV_ID, 0) > 0) THEN
            BEGIN

                :ITITULO   = :ITITULO||': '||:WV_TITULO;
                :DESCRICAO = FN_ELIPSE((:ITITULO||': '||:WV_DESCRICAO), 1000);

                :MOSTRAR_T = 1;
                :VALID     = 1;

            END

        END
    END

    IF ( (:ITIPO = 'M' AND COALESCE(:ICOUNT, 0) = 0 AND COALESCE(:VALID, 0) = 1) OR (:ITIPO = 'D' AND COALESCE(:ICOUNT, 0) > 0 AND COALESCE(:ICOUNT, 0) < 11 AND COALESCE(:VALID, 0) = 1) ) THEN
    BEGIN

        FOR
            SELECT
                W.ID,
                W.TITULO,
                W.DESCRICAO,
                W.TIPO
    
            FROM TBWORKFLOW W
            WHERE W.ID = :IMODELO_WORKFLOW
            AND W.STATUS = '1'
    
        INTO
            :MOD_WORKFLOW_ID,
            :MOD_WORKFLOW_TITULO,
            :MOD_WORKFLOW_DESCRICAO,
            :MOD_WORKFLOW_TIPO
    
        DO
        BEGIN
    
            :DT_INICIAL_P = CURRENT_TIMESTAMP;
            :DT_FINAL_P   = CURRENT_TIMESTAMP;


            IF (COALESCE(:MOSTRAR_T, 0) = 0) THEN
            BEGIN
                :ITITULO = :ITITULO||' - '||:MOD_WORKFLOW_TITULO;
                :DESCRICAO = FN_ELIPSE((:ITITULO||' - '||:MOD_WORKFLOW_DESCRICAO), 1000);
            END


            /*******************************************************/
    
            :WORKFLOW_ID = GEN_ID(GTBWORKFLOW_ITEM, 1);
    
            INSERT INTO TBWORKFLOW_ITEM (ID, WORKFLOW_ID, TITULO,  DESCRICAO,  USUARIO_ID, DATAHORA_INI_PREVISTA, DATAHORA_FIM_PREVISTA, TIPO) 
                VALUES (:WORKFLOW_ID, :MOD_WORKFLOW_ID, FN_ELIPSE(:ITITULO, 50), FN_ELIPSE(:DESCRICAO, 200), FN_CURRENT_USER_ID(), :DT_INICIAL_P, :DT_FINAL_P, :ITIPO);
    
            
            INSERT INTO TBWORKFLOW_ITEM_HISTORICO (WORKFLOW_ITEM_TAREFA_ID, WORKFLOW_ITEM_ID, HISTORICO, USUARIO_ID)
                VALUES (0, :WORKFLOW_ID, FN_ELIPSE(('WOKRFLOW '||FN_ELIPSE(:ITITULO, 50)||' INCLUIDO VIA GERACAO AUTOMATICA('||:ITELA||')'), 1000), FN_CURRENT_USER_ID());

            /*******************************************************/
    
            :PRIMEIRO = 1;
    
            /* Tarefas */
            FOR
                SELECT
                    WT.ID,
                    WT.TITULO,
                    WT.DESCRICAO,
                    WT.SEQUENCIA,
                    WT.STATUS,
                    WT.ORDEM,
                    WT.PONTO_REPROVACAO,
                    COALESCE(WT.TEMPO_PREVISTO, 0.0000) AS TEMPO_PREVISTO,
                    WT.TIPO_DESCRICAO,
                    WT.COR
    
                FROM TBWORKFLOW_TAREFA WT
                WHERE WT.WORKFLOW_ID = :MOD_WORKFLOW_ID
                AND WT.STATUS = '1'
    
            INTO
                :TAREFA_ID,
                :TAREFA_TITULO,
                :TAREFA_DESCRICAO,
                :TAREFA_SEQUENCIA,
                :TAREFA_STATUS,
                :TAREFA_ORDEM,
                :TAREFA_PONTO_REPROVACAO,
                :TAREFA_TEMPO_PREVISTO,
                :TAREFA_TIPO_DESCRICAO,
                :TAREFA_COR
    
            DO
            BEGIN
    
                IF (COALESCE(:PRIMEIRO, 0) = 1) THEN
                BEGIN
    
                    :DT_INICIAL_P = :DT_INICIAL_P;
                    :DT_FINAL_P   = DATEADD(MINUTE, :TAREFA_TEMPO_PREVISTO, :DT_INICIAL_P);
    
                    :PRIMEIRO     = 0;
    
                END ELSE
                BEGIN
    
                    :DT_INICIAL_P = :DT_FINAL_P;
                    :DT_FINAL_P   = DATEADD(MINUTE, :TAREFA_TEMPO_PREVISTO, :DT_INICIAL_P);
    
                END
    
                /*******************************************************/
    
                :WORKFLOW_TAREFA_ID = GEN_ID(GTBWORKFLOW_ITEM_TAREFA, 1);
    
                INSERT INTO TBWORKFLOW_ITEM_TAREFA (ID, WORKFLOW_ID, WORKFLOW_ITEM_ID, WORKFLOW_TAREFA_MODELO_ID, TITULO, DESCRICAO, SEQUENCIA, TEMPO_PREVISTO, DATAHORA_INI_PREVISTA, DATAHORA_FIM_PREVISTA, DOMINGO, SEGUNDA, TERCA, QUARTA, QUINTA, SEXTA, SABADO, HORARIO_PERMITIDO, ORDEM,PONTO_REPROVACAO, STATUSEXCLUSAO)
                    VALUES (:WORKFLOW_TAREFA_ID, :MOD_WORKFLOW_ID, :WORKFLOW_ID, :TAREFA_ID, :TAREFA_TITULO, :TAREFA_DESCRICAO, :TAREFA_SEQUENCIA, :TAREFA_TEMPO_PREVISTO, :DT_INICIAL_P, :DT_FINAL_P, 0, 1, 1, 1, 1, 1, 0, '07:00-11:50;13:02-17:00', :TAREFA_ORDEM, :TAREFA_PONTO_REPROVACAO, 0);
    
                /*******************************************************/
    
                /* Gravar Destinatários */
                INSERT INTO TBWORKFLOW_ITEM_DESTINATARIO (ID, WORKFLOW_ID, WORKFLOW_ITEM_ID, WORKFLOW_ITEM_TAREFA_ID, USUARIO_ID, STATUSEXCLUSAO, NOTIFICACAO, REINICIAR)
                    SELECT
                        GEN_ID(GTBWORKFLOW_ITEM_DESTINATARIO, 1),
                        WD.WORKFLOW_ID,
                        :WORKFLOW_ID,
                        :WORKFLOW_TAREFA_ID,
                        WD.USUARIO_ID,
                        0,
                        COALESCE(WD.NOTIFICACAO, 1),
                        COALESCE(WD.REINICIAR, 0)
                    FROM TBWORKFLOW_DESTINATARIO WD
                    WHERE WD.WORKFLOW_ID = :MOD_WORKFLOW_ID
                    AND WD.WORKFLOW_TAREFA_ID = :TAREFA_ID;
    
                /* Gravar Dependências */
                INSERT INTO TBWORKFLOW_ITEM_DEPENDENCIA (ID, WORKFLOW_ID, WORKFLOW_ITEM_ID, WORKFLOW_ITEM_TAREFA_ID, WORKFLOW_ITEM_DEPENDENTE_ID)
                    SELECT
                        GEN_ID(GTBWORKFLOW_ITEM_DEPENDENCIA, 1),
                        WD2.WORKFLOW_ID,
                        :WORKFLOW_ID,
                        WD2.WORKFLOW_TAREFA_ID,
                        :WORKFLOW_TAREFA_ID
                    FROM TBWORKFLOW_DEPENDENCIA WD2
                    WHERE WD2.WORKFLOW_ID = :MOD_WORKFLOW_ID
                    AND WD2.WORKFLOW_DEPENDENTE_ID = :TAREFA_ID;
    
                /* Gravar Usuários que Serão Notificados */
                INSERT INTO TBWORKFLOW_ITEM_NOTIFICADO (ID, WORKFLOW_ID, WORKFLOW_ITEM_ID, WORKFLOW_ITEM_TAREFA_ID, USUARIO_ID, STATUSEXCLUSAO)
                    SELECT
                        GEN_ID(GTBWORKFLOW_ITEM_NOTIFICADO, 1),
                        A.WORKFLOW_ID,
                        :WORKFLOW_ID,
                        :WORKFLOW_TAREFA_ID,
                        A.USUARIO_ID,
                        0
                    FROM TBWORKFLOW_DESTINATARIO A
                    WHERE A.WORKFLOW_ID = :MOD_WORKFLOW_ID
                    AND A.WORKFLOW_TAREFA_ID = :TAREFA_ID
                    AND COALESCE(A.NOTIFICACAO, 1) = 1;
    
                /*******************************************************/
                /*******************************************************/
                /* Subtask (Possível uso de subworkflows) */
    
                :CHAVE = :ICOUNT;
    
                /*******************************************************/
    
                FOR
                    SELECT
                        A.ID AS CAMPO_ID,
                        A.ROTULO,
                        A.TIPO,
                        COALESCE(A.WORKFLOW_SUBTASK_ID, 0) AS WORKFLOW_SUBTASK_ID
        
                    FROM TBWORKFLOW_CAMPO A
                    WHERE A.WORKFLOW_ID = :MOD_WORKFLOW_ID
                    AND A.WORKFLOW_TAREFA_ID = :TAREFA_ID
    
                INTO
                    :CAMPO_ID,
                    :CAMPO_ROTULO,
                    :CAMPO_TIPO,
                    :CAMPO_WORK_SUBTASK_ID
    
                DO
                BEGIN
    
                    :CHAVE = :CHAVE + 1;
    
                    /*******************************************************/
    
                    :WORKFLOW_SUBTASK_ID = 0;
                    IF (COALESCE(:CAMPO_WORK_SUBTASK_ID, 0) > 0) THEN
                    BEGIN
                        :WORKFLOW_SUBTASK_ID = COALESCE((SELECT FIRST 1 SPW.OWORKFLOW_ID FROM SPI_WORKFLOW(:CAMPO_WORK_SUBTASK_ID, :CAMPO_ROTULO, :ITELA, 'D', :CHAVE) SPW), 0);
                    END
    
                    /*******************************************************/
    
                    :WORKFLOW_CAMPO_ID = GEN_ID(GTBWORKFLOW_ITEM_CAMPO, 1);
    
                    INSERT INTO TBWORKFLOW_ITEM_CAMPO (ID, WORKFLOW_ID, WORKFLOW_ITEM_ID, WORKFLOW_ITEM_TAREFA_ID, WORKFLOW_TAREFA_CAMPO_ID, ROTULO, TIPO, STATUSEXCLUSAO, WORKFLOW_ITEM_SUBTASK_ID) 
                        VALUES (:WORKFLOW_CAMPO_ID, :MOD_WORKFLOW_ID, :WORKFLOW_ID, :WORKFLOW_TAREFA_ID, :CAMPO_ID, :CAMPO_ROTULO, :CAMPO_TIPO, '0', :WORKFLOW_SUBTASK_ID);
    
                END
            END
    
            :OWORKFLOW_ID = :WORKFLOW_ID;
            SUSPEND;
    
        END
    END ELSE
    BEGIN

        :OWORKFLOW_ID = 0;
        SUSPEND;

    END
END
^

SET TERM ; ^

/**********************************************************************************/
/**********************************************************************************/
/**********************************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SPI_CASO (
    IPAINEL_ID integer not null,
    IMOTIVO_ID integer not null,
    ITIPO_ID integer not null,
    IORIGEM_ID integer not null,
    ITELA varchar(10) not null,
    P01 varchar(6000) = '',
    P02 varchar(6000) = '',
    P03 varchar(6000) = '',
    P04 varchar(6000) = '',
    P05 varchar(6000) = '',
    P06 varchar(6000) = '',
    P07 varchar(6000) = '',
    P08 varchar(6000) = '',
    P09 varchar(6000) = '',
    P10 varchar(6000) = '')
as
declare variable PAINEL_ID integer;
declare variable CASO_ID integer;
declare variable PARAM_EXEC integer;
declare variable CAMPO_ID integer;
declare variable CAMPO_DESC varchar(150);
declare variable REQUERED integer;
declare variable CAMPO_TIPO integer;
declare variable CAMPO_DESC_TIPO varchar(15);
declare variable CAMPO_GERAR_JSON blob sub_type 1 segment size 80;
declare variable CAMPO_SQL blob sub_type 1 segment size 80;
declare variable CAMPO_VALOR_PADRAO varchar(200);
declare variable VALOR varchar(7000);
declare variable JSON varchar(500);
declare variable MODELO_WORKFLOW_ID integer;
declare variable ORDEM_WORKFLOW integer;
declare variable WORKFLOW_ID integer;
declare variable USUARIO_ID integer;
declare variable USUARIO_DESC varchar(100);
declare variable URL varchar(500);
declare variable CORPO blob sub_type 1 segment size 80;
declare variable USUARIO_ID_NOTIF integer;
declare variable TIPOS_NOTIF varchar(500);
BEGIN

    FOR
        SELECT FIRST 1
            P.ID AS PAINEL_ID

        FROM TBCASO_PAINEL P
        WHERE P.ID = :IPAINEL_ID
        AND P.STATUS = 1
        AND P.PERMITE_GERAR_AUTOMATICO = 1

    INTO
        :PAINEL_ID

    DO
    BEGIN

        /* Gerando Caso - Atribuindo CASO_ID */
        :CASO_ID = GEN_ID(GTBCASO_REGISTRO, 1);

        IF (COALESCE(:CASO_ID, 0) > 0) THEN
        BEGIN

            INSERT INTO TBCASO_REGISTRO (ID, PAINEL_ID, DATAHORA_REGISTRO, USUARIO_ID, MOTIVO_ID, TIPO_ID, ORIGEM_ID, RESPONSAVEL_ID, STATUS_ID, CONTATO_ID, FECHADO)
                VALUES (:CASO_ID, :IPAINEL_ID, CURRENT_TIMESTAMP, FN_CURRENT_USER_ID(), :IMOTIVO_ID, :ITIPO_ID, :IORIGEM_ID, COALESCE((SELECT FIRST 1 CU.USUARIO_ID FROM TBCASO_USUARIOS CU WHERE CU.PAINEL_ID = :PAINEL_ID AND CU.USUARIO_ID = FN_CURRENT_USER_ID() AND CU.RESPONSAVEL = 1), 0), COALESCE((SELECT FIRST 1 CS.ID FROM TBCASO_STATUS CS WHERE CS.PAINEL_ID = :PAINEL_ID AND CS.ABERTO = 1), 0), 0, 0);

            EXECUTE PROCEDURE SPI_CASO_HISTORICO(:CASO_ID, :PAINEL_ID, 'REGISTRO DE CASO AUTOMATICO ('||:ITELA||')');

            /* Registrar valores dos Campos */
            FOR
                SELECT
                    PC.PARAM_EXEC,
    
                    /* Dados dos Campos */
                    PC.ID,
                    PC.DESCRICAO,
                    PC.REQUERED,
    
                    PC.TIPO,
                    IIF(PC.TIPO = 1, 'STRING',
                    IIF(PC.TIPO = 2, 'NUMERO',
                    IIF(PC.TIPO = 3, 'DATA',
                    IIF(PC.TIPO = 4, 'CHECK',
                    IIF(PC.TIPO = 5, 'RADIO',
                    IIF(PC.TIPO = 6, 'RANGE',
                    IIF(PC.TIPO = 7, 'SEARCH',
                    IIF(PC.TIPO = 8, 'TIME',
                    IIF(PC.TIPO = 9, 'SELECT',
                    IIF(PC.TIPO = 10, 'TEXT AREA', '')))))))))) AS DESC_TIPO,
    
                    /* Dados Vinculados aos Campos - CAMPO_CONSULTA */
                    COALESCE(CC.CAMPO_TABELA, '') AS CAMPOS_CONSULTA,
                    FN_CAST_BLOB_TO_TEXT(COALESCE(S.SQL, '')) AS SQL,
    
                    /* Dados Vinculados aos Campos - PAINEL_CONF_ITENS */
                    COALESCE((SELECT FIRST 1 PCI.VALOR FROM TBCASO_PAINEL_CONF_ITENS PCI WHERE PCI.PAINEL_ID = PC.PAINEL_ID AND PCI.CAMPO_ID = PC.ID AND PCI.SELECIONADO = 1), COALESCE(PC."DEFAULT", '')) AS VALOR_PADRAO
    
                FROM TBCASO_PAINEL_CONF PC
                INNER JOIN TBCASO_CAMPOS_AGRUPAMENTO CA ON CA.ID = PC.GRUPO_ID AND CA.PAINEL_ID = PC.PAINEL_ID
                LEFT JOIN TBCASO_CAMPO_CONSULTA CC ON CC.CAMPO_ID = PC.ID AND CC.PAINEL_ID = PC.PAINEL_ID
                LEFT JOIN TBCASO_SQL S ON S.ID = CC.SQL_ID
                WHERE PC.PAINEL_ID = :PAINEL_ID
                AND PC.STATUS = 1
    
                ORDER BY PC.ORDEM
        
            INTO
                :PARAM_EXEC,
                :CAMPO_ID,
                :CAMPO_DESC,
                :REQUERED,
                :CAMPO_TIPO,
                :CAMPO_DESC_TIPO,
                :CAMPO_GERAR_JSON,
                :CAMPO_SQL,
                :CAMPO_VALOR_PADRAO
        
            DO
            BEGIN

                IF (COALESCE(:PARAM_EXEC, 0) = 1) THEN
                BEGIN
                    :VALOR = :P01;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 2) THEN
                BEGIN
                    :VALOR = :P02;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 3) THEN
                BEGIN
                    :VALOR = :P03;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 4) THEN
                BEGIN
                    :VALOR = :P04;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 5) THEN
                BEGIN
                    :VALOR = :P05;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 6) THEN
                BEGIN
                    :VALOR = :P06;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 7) THEN
                BEGIN
                    :VALOR = :P07;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 8) THEN
                BEGIN
                    :VALOR = :P08;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 9) THEN
                BEGIN
                    :VALOR = :P09;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 10) THEN
                BEGIN
                    :VALOR = :P10;
                END

                /*************************************/

                :JSON = '';
                IF (COALESCE(:CAMPO_TIPO, 0) = 7) THEN
                BEGIN



                    :JSON = '';

                END

                /*************************************/

                IF (COALESCE(:PARAM_EXEC, 0) > 0) THEN
                BEGIN

                    IF (COALESCE(:REQUERED, 0) = 1 AND COALESCE(:VALOR, '') = '') THEN
                    BEGIN
                        EXCEPTION "..." 'CAMPO '||:CAMPO_DESC||' E OBRIGATORIO! ENTRE EM CONTATO COM O SUPORTE TECNICO.';
                    END

                    INSERT INTO TBCASO_REGISTRO_DETALHE (REGISTRO_ID, CAMPO_ID, VALOR, PAINEL_ID, JSON)
                        VALUES (:CASO_ID, :CAMPO_ID, :VALOR, :PAINEL_ID, :JSON);

                END ELSE
                BEGIN

                    IF (COALESCE(:REQUERED, 0) = 1 AND COALESCE(:CAMPO_VALOR_PADRAO, '') = '') THEN
                    BEGIN
                        EXCEPTION "..." 'CAMPO '||:CAMPO_DESC||' E OBRIGATORIO! ENTRE EM CONTATO COM O SUPORTE TECNICO.';
                    END

                    INSERT INTO TBCASO_REGISTRO_DETALHE (REGISTRO_ID, CAMPO_ID, VALOR, PAINEL_ID, JSON)
                        VALUES (:CASO_ID, :CAMPO_ID, :CAMPO_VALOR_PADRAO, :PAINEL_ID, :JSON);

                END

                /*******************************************************/
                -- TBCASO_REGISTRO_ITENS -- Ainda pra descobrir / sem uso

            END

            /* Registrar Workflows no Caso */
            :ORDEM_WORKFLOW = 0;

            FOR
                SELECT
                    W.MODELO_WORKFLOW_ID

                FROM TBCASO_WORKFLOWS W
                WHERE W.PAINEL_ID = :PAINEL_ID

            INTO
                :MODELO_WORKFLOW_ID

            DO
            BEGIN

                :ORDEM_WORKFLOW = :ORDEM_WORKFLOW + 1;


                :WORKFLOW_ID = COALESCE((SELECT FIRST 1 SPW.OWORKFLOW_ID FROM SPI_WORKFLOW(:MODELO_WORKFLOW_ID, 'CASO: '||FN_LPAD(:CASO_ID, 6, '0')||'', :ITELA, 'M', 0) SPW), 0);

                INSERT INTO TBCASO_REGISTRO_WORKFLOWS (REGISTRO_ID, PAINEL_ID, WORKFLOW_ITEM_ID, ORDEM)
                    VALUES (:CASO_ID, :PAINEL_ID, :WORKFLOW_ID, :ORDEM_WORKFLOW);

            END

            /* Registrar Envolvidos por Padrão - Motivo */
            FOR
                SELECT
                    ME.USUARIO_ID,
                    IIF(CHAR_LENGTH(U.NOME) > 0, U.NOME, U.USUARIO) AS USUARIO_DESC

                FROM TBCASO_MOTIVO_ENVOLVIDOS ME
                INNER JOIN TBUSUARIO U ON U.CODIGO = ME.USUARIO_ID
                WHERE ME.PAINEL_ID = :PAINEL_ID
                AND ME.MOTIVO_ID = :IMOTIVO_ID
                AND U.STATUS = '1'

            INTO
                :USUARIO_ID,
                :USUARIO_DESC

            DO
            BEGIN

                INSERT INTO TBCASO_ENVOLVIDOS (PAINEL_ID, CASO_ID, USUARIO_ID)
                    VALUES (:PAINEL_ID, :CASO_ID, :USUARIO_ID);

                EXECUTE PROCEDURE SPI_CASO_HISTORICO(:CASO_ID, :PAINEL_ID, 'USUARIO '||:USUARIO_DESC||' ENVOLVIDO POR VINCULO COM MOTIVO');

            END


            /***********************************************/
            /* Notificação do Sistema para Criação de Caso */
            :URL = FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_11160/'||:PAINEL_ID||'?CASO_ID='||:CASO_ID||'';

            :CORPO = '';
            :CORPO = :CORPO||'FOI REGISTRADO UM NOVO CASO POR '|| COALESCE((SELECT FIRST 1 UPPER(IIF(CHAR_LENGTH(U.NOME) > 0, U.NOME, U.USUARIO)) FROM TBUSUARIO U WHERE U.CODIGO = FN_CURRENT_USER_ID()), '') ||'<br>';
            :CORPO = :CORPO||'<a href="'||:URL||'" target="_blank" >CASO:'||FN_LPAD(:CASO_ID, 6, '0')||' - Ver Este Caso</a><br><br>';
            :CORPO = :CORPO||''|| FORMATDATETIME(CURRENT_TIMESTAMP) ||'';

            FOR
                SELECT
                    X.USUARIO_ID,
                    LIST(TRIM(X.TIPO)) AS TIPOS

                FROM (
                    SELECT
                        U.USUARIO_ID,
                        'RESPONSAVEL' AS TIPO

                    FROM TBCASO_USUARIOS U
                    WHERE U.NOTIFICACAO = 1
                    AND U.RESPONSAVEL = 1
                    AND U.PAINEL_ID = :PAINEL_ID
                    AND U.USUARIO_ID <> FN_CURRENT_USER_ID()
                    AND U.USUARIO_ID > 0

                    UNION

                    SELECT
                        E.USUARIO_ID,
                        'ENVOLVIDO' AS TIPO

                    FROM TBCASO_ENVOLVIDOS E
                    WHERE E.CASO_ID = :CASO_ID
                    AND E.USUARIO_ID <> FN_CURRENT_USER_ID()

                    UNION

                    SELECT
                        R.USUARIO_ID,
                        'USUARIO' AS TIPO

                    FROM TBCASO_REGISTRO R
                    WHERE R.ID = :CASO_ID
                    AND R.USUARIO_ID <> FN_CURRENT_USER_ID()
                ) X

                GROUP BY
                    X.USUARIO_ID

                ORDER BY X.USUARIO_ID DESC

            INTO
                :USUARIO_ID_NOTIF,
                :TIPOS_NOTIF

            DO
            BEGIN

                INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, MENSAGEM, EMITENTE)
                    VALUES (0, :USUARIO_ID_NOTIF, 0, 0, 'NOVO CASO', 0, 0, :CORPO, FN_CURRENT_USER_ID());

            END
            /***********************************************/
            /***********************************************/

        END
    END
END
^

SET TERM ; ^

