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) = '',
    P11 varchar(6000) = '',
    P12 varchar(6000) = '',
    P13 varchar(6000) = '',
    P14 varchar(6000) = '',
    P15 varchar(6000) = '',
    P16 varchar(6000) = '',
    P17 varchar(6000) = '',
    P18 varchar(6000) = '',
    P19 varchar(6000) = '',
    P20 varchar(6000) = '',
    VINCULO_CASO_ID integer = 0,
    VINCULO_CASO_TABELA varchar(50) = '')
returns (
    OCASO_ID integer)
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 CAMPO_ITEM_ID integer;
declare variable CAMPO_ITEM_VALOR integer;
declare variable CAMPO_ITEM_SELECIONADO integer;
declare variable VALOR varchar(7000);
declare variable JSON blob sub_type 1 segment size 80;
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, CASO_ORIGEM_ID, CASO_ORIGEM_TABELA)
                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, COALESCE(:VINCULO_CASO_ID, 0), COALESCE(:VINCULO_CASO_TABELA, ''));

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

            IF (COALESCE(:VINCULO_CASO_ID, 0) > 0) THEN
            BEGIN
                EXECUTE PROCEDURE SPI_CASO_HISTORICO(:CASO_ID, :PAINEL_ID, 'NOVO CASO GERADO VIA VINCULO COM TABELA: '||COALESCE(:VINCULO_CASO_TABELA, '')||' - N: '||COALESCE(:VINCULO_CASO_ID, 0)||'');
            END

            /* 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
                IF (COALESCE(:PARAM_EXEC, 0) = 11) THEN
                BEGIN
                    :VALOR = :P11;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 12) THEN
                BEGIN
                    :VALOR = :P12;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 13) THEN
                BEGIN
                    :VALOR = :P13;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 14) THEN
                BEGIN
                    :VALOR = :P14;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 15) THEN
                BEGIN
                    :VALOR = :P15;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 16) THEN
                BEGIN
                    :VALOR = :P16;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 17) THEN
                BEGIN
                    :VALOR = :P17;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 18) THEN
                BEGIN
                    :VALOR = :P18;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 19) THEN
                BEGIN
                    :VALOR = :P19;
                END ELSE
                IF (COALESCE(:PARAM_EXEC, 0) = 20) THEN
                BEGIN
                    :VALOR = :P20;
                END

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

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

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

                IF (COALESCE(:CAMPO_TIPO, 0) = 4) THEN
                BEGIN

                    FOR
                        SELECT
                            PCI.ID,
                            PCI.VALOR,
    
                            IIF(COALESCE(:CAMPO_VALOR_PADRAO, '') = FN_IS_EMPTY(PCI.VALOR, ''), 1, 0) AS SELECIONADO
                        
                        FROM TBCASO_PAINEL_CONF_ITENS PCI
                        WHERE PCI.CAMPO_ID = :CAMPO_ID
                        AND PCI.PAINEL_ID = :PAINEL_ID
    
                        ORDER BY PCI.ORDEM
    
                    INTO
                        :CAMPO_ITEM_ID,
                        :CAMPO_ITEM_VALOR,
                        :CAMPO_ITEM_SELECIONADO
    
                    DO
                    BEGIN
    
                        INSERT INTO TBCASO_REGISTRO_ITENS (VALOR, CAMPO_ID, REGISTRO_ID, SELECIONADO)
                            VALUES (:CAMPO_ITEM_VALOR, :CAMPO_ID, :CASO_ID, :CAMPO_ITEM_SELECIONADO);
    
                    END

                END
            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

                IF (COALESCE(:USUARIO_ID, 0) <> FN_CURRENT_USER_ID()) THEN
                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
            END

            /* Registrar Comentarios do Caso Anterior - Somente se houver caso de origem da TBCASO_REGISTRO */
            IF (COALESCE(:VINCULO_CASO_TABELA, '') = 'TBCASO_REGISTRO' AND COALESCE(:VINCULO_CASO_ID, 0) > 0) THEN
            BEGIN

                INSERT INTO TBCASO_FEED (DE, PARA, EM_COPIA, EM_COPIA_OCULTA, DATAHORA, ASSUNTO, PAINEL_ID, CASO_ID, FILES, SUBFEED, TIPO, GOSTEI, USUARIO_ID, MENSAGEM, ORIGEM, COMENTARIO, CONTATO, LISTA_FILE, WORKFLOW_ITEM_ID)
                    SELECT
                        CF.DE,
                        CF.PARA,
                        CF.EM_COPIA,
                        CF.EM_COPIA_OCULTA,
                        CURRENT_TIMESTAMP AS DATAHORA,
                        CF.ASSUNTO,
                        CAST(:PAINEL_ID AS INTEGER) AS PAINEL_ID,
                        CAST(:CASO_ID AS INTEGER) AS CASO_ID,
                        CF.FILES,
                        CF.SUBFEED,
                        CF.TIPO,
                        CF.GOSTEI,
                        CF.USUARIO_ID,
                        CF.MENSAGEM,
                        2 AS ORIGEM,
                        CF.COMENTARIO,
                        CF.CONTATO,
                        CF.LISTA_FILE,
                        CF.WORKFLOW_ITEM_ID

                    FROM TBCASO_FEED CF
                    INNER JOIN TBCASO_REGISTRO CR ON CR.ID = CF.CASO_ID
                    WHERE CF.COMENTARIO = 1
                    AND CF.CASO_ID = :VINCULO_CASO_ID;
                    
            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
            /***********************************************/
            /***********************************************/

            :OCASO_ID = :CASO_ID;
            SUSPEND;

        END
    END
END
^

SET TERM ; ^

