ALTER TABLE TBRELATORIO_WEB ADD VERSAO_IMP INTEGER;
update TBRELATORIO_WEB a set a.versao_imp = 1;

UPDATE OR INSERT INTO TBPARAMETRO (TABELA, CONTROLE, CODIGO, DESCRICAO, VALOR, OBSERVACAO, GRUPO, DATAHORA, USUARIO_ID)
                           VALUES ('TBRELATORIO_WEB', 1, 'SERVIDOR_RELATORIOS', 'servidor de relatorios', 'https://kayros.gcweb.app.br', 'URL DO SERVIDOR DE RELATORIOS', 'WEB11081', '2022-06-10 09:35:31', 186)
                         MATCHING (TABELA, CODIGO);
UPDATE OR INSERT INTO TBPARAMETRO (TABELA, CONTROLE, CODIGO, DESCRICAO, VALOR, OBSERVACAO, GRUPO, DATAHORA, USUARIO_ID)
                           VALUES ('TBRELATORIO_WEB', 2, 'INCREMENTAR_VERSSAO', 'incrementar versão dos relatórios', '0', '1 - SIM, SE ESTE FOR UM SERVIDOR DE RELATORIO
0 - NÃO, SE NÃO É UM SERVIDOR', 'WEB11081', '2022-06-10 09:37:00', 186)
                         MATCHING (TABELA, CODIGO);

COMMIT WORK;

CREATE INDEX TTBRELATORIO_WEB_DETALHE_02
ON TBRELATORIO_WEB_DETALHE (relatorio_id);

CREATE INDEX ITBRELATORIO_WEB_SQL_02
ON TBRELATORIO_WEB_SQL (RELATORIO_ID);

CREATE INDEX ITBRELATORIO_WEB_GRUPOS_02
ON TBRELATORIO_WEB_GRUPOS (relatorio_id);

CREATE INDEX TTBRELATORIO_WEB_PARAMETRO_02
ON TBRELATORIO_WEB_PARAMETRO (relatorio_id);

CREATE INDEX ITBRELATORIO_WEB_MENUS_02
ON TBRELATORIO_WEB_MENUS (relatorio_web_id);

CREATE INDEX ITBRELATORIO_WEB_SERV_01
ON TBRELATORIO_WEB_SERV (SERVIDOR_ID);

CREATE INDEX ITBSERVIDOR_01
ON TBSERVIDOR (URL);

CREATE INDEX ITBRELATORIO_WEB_GRAFICO_03
ON TBRELATORIO_WEB_GRAFICO (RELATORIO_ID);

ALTER TABLE TBRELATORIO_WEB_SERV
    ADD REMOVER INTEGER;

ALTER TABLE TBSERVIDOR
    ADD DESCRICAO_RESUMIDA VARCHAR(10);

update tbservidor d set d.descricao_resumida = substring(d.descricao from 1 for 3);

CREATE INDEX ITBRELATORIO_WEB_SERV_02
ON TBRELATORIO_WEB_SERV (RELATORIO_ID);

SET TERM ^ ;

CREATE OR ALTER trigger ttbrelatorio_web_b01u for tbrelatorio_web
active before update position 2
AS
begin
  if(new.VERSAO_IMP is distinct from old.versao_imp)then
  begin
       EXECUTE PROCEDURE SPI_HISTORICO('TBRELATORIO_WEB',NEW.VERSAO_IMP, 'VERSAO: '||coalesce(old.versao_imp,0)||' -> '||coalesce(new.VERSAO_IMP,0));
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_RELATORIO_WEB_ID (
    PARTIDA integer = 0,
    TAG integer = 0)
returns integer
as
declare variable MAX_ID integer;
declare variable EXISTE integer;
begin
  MAX_ID = 0;

  if(TAG < 100)then
  begin
      MAX_ID = coalesce((
        select first 1
            PROXIMO
        from(
            select
                codigo,
                LINHA,
                28000 + LINHA as PROXIMO,
                iif(codigo = (28000 + LINHA), 0, 1) as quebra
            from(
                select
                    codigo,
                    row_number() over(order by codigo) as LINHA
                from(
                    select distinct
                        e.codigo
                    from tbrelatorio_web e
                    order by e.codigo
                ) order by codigo
            ) order by codigo
        ) where quebra = 1 and PROXIMO > :PARTIDA
        order by codigo
      ),0);
      
      EXISTE = coalesce((select  first 1 1 from tbrelatorio_web e where e.codigo = :MAX_ID),0);
    
      if(MAX_ID > 0)then
      begin
          if(EXISTE = 0)then
          begin
    
          end else
          begin
            MAX_ID = FN_RELATORIO_WEB_ID(:MAX_ID, TAG+1);
          end
      end else
      begin
          MAX_ID = coalesce((select max(codigo) + 1 from tbrelatorio_web e),0);
      end
  end

  return MAX_ID;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DUPLICAR_RELATORIO_WEB (
    RELATORIO_ID integer)
returns (
    NEW_ID integer,
    CODIGO integer)
as
declare variable NEW_SQL_ID integer;
declare variable ID integer;
declare variable SQL blob sub_type 1 segment size 80;
declare variable STATUS integer;
declare variable DESCRICAO varchar(500);
declare variable ORDEM integer;
declare variable PRINCIPAL integer;
begin
    NEW_ID = gen_id(GTBRELATORIO_WEB, 1);

    CODIGO = coalesce((select first 1 E.codigo FROM tbrelatorio_web E WHERE E.id = :RELATORIO_ID),0);

    insert into TBRELATORIO_WEB (
        ID,
        NOME,
        DESCRICAO,
        TIPO,
        TEMPLATE_ID,
        STATUS,
        MENU_GRUPO,
        ZEBRADO,
        TOTALIZADOR,
        PAISAGEM,
        VERSAO,
        FONTE_WEB,
        FONTE_EXP,
        ACORDEON,
        FILTRO,
        JS,
        LARGURA,
        COMPRIMENTO,
        EXECUTAR_COMANDOS,
        CODIGO,
        MOSTRAR_GRAFICO,
        MOSTRAR_TABELA,
        UPDATE_TEG,
        JS3,
        CABECALHO_CSV
    ) select
        :NEW_ID as ID,
        NOME,
        DESCRICAO,
        TIPO,
        TEMPLATE_ID,
        STATUS,
        MENU_GRUPO,
        ZEBRADO,
        TOTALIZADOR,
        PAISAGEM,
        VERSAO,
        FONTE_WEB,
        FONTE_EXP,
        ACORDEON,
        FILTRO,
        JS,
        LARGURA,
        COMPRIMENTO,
        EXECUTAR_COMANDOS,
        CODIGO,
        MOSTRAR_GRAFICO,
        MOSTRAR_TABELA,
        UPDATE_TEG,
        JS3,
        CABECALHO_CSV
    from TBRELATORIO_WEB e where e.id = :RELATORIO_ID;

    for
        select
            ID,
            SQL,
            STATUS,
            DESCRICAO,
            ORDEM,
            PRINCIPAL
        from TBRELATORIO_WEB_SQL e where e.relatorio_id = :RELATORIO_ID
    into
        :ID,
        :SQL,
        :STATUS,
        :DESCRICAO,
        :ORDEM,
        :PRINCIPAL
    do begin

        NEW_SQL_ID = gen_id(GTBRELATORIO_WEB_SQL, 1);

        insert into TBRELATORIO_WEB_SQL (
            ID,
            SQL,
            RELATORIO_ID,
            STATUS,
            DESCRICAO,
            CODIGO,
            ORDEM,
            PRINCIPAL
        ) select first 1
            :NEW_SQL_ID ID,
            SQL,
            :NEW_ID RELATORIO_ID,
            STATUS,
            DESCRICAO,
            CODIGO,
            ORDEM,
            PRINCIPAL
        from TBRELATORIO_WEB_SQL e where e.id = :ID;

        if(PRINCIPAL = 1)then
        begin
            insert into TBRELATORIO_WEB_DETALHE (
                ID,
                RELATORIO_ID,
                PERCENTUAL,
                DESCRICAO,
                CLASSE,
                CAMPO,
                ORDEM,
                MASCARA,
                VISIVEL,
                COR,
                TOTALIZAR,
                CASAS,
                "INDEX",
                AGRUPAR,
                TOTAL_GRUPO,
                TOTAL_TIPO,
                FORMULA,
                PREFIX,
                SUFIX,
                COL_TAMANHO,
                URL_LINK,
                SQL_ID,
                INDICE,
                PREFIXT,
                SUFIXT,
                CODIGO,
                STYLE,
                HTML
            ) select
                gen_id(GTBRELATORIO_WEB_DETALHE, 1) ID,
                :NEW_ID RELATORIO_ID,
                PERCENTUAL,
                DESCRICAO,
                CLASSE,
                CAMPO,
                ORDEM,
                MASCARA,
                VISIVEL,
                COR,
                TOTALIZAR,
                CASAS,
                "INDEX",
                AGRUPAR,
                TOTAL_GRUPO,
                TOTAL_TIPO,
                FORMULA,
                PREFIX,
                SUFIX,
                COL_TAMANHO,
                URL_LINK,
                :NEW_SQL_ID SQL_ID,
                INDICE,
                PREFIXT,
                SUFIXT,
                CODIGO,
                STYLE,
                HTML
            from TBRELATORIO_WEB_DETALHE e where e.relatorio_id = :RELATORIO_ID;
        end
    end

    insert into TBRELATORIO_WEB_GRUPOS (
        ID,
        RELATORIO_ID,
        JSON,
        CODIGO
    )
    select
        gen_id(GTBRELATORIO_WEB_GRUPOS, 1) ID,
        :NEW_ID RELATORIO_ID,
        JSON,
        CODIGO
    from TBRELATORIO_WEB_GRUPOS e where e.relatorio_id = :RELATORIO_ID;

    insert into TBRELATORIO_WEB_PARAMETRO (
        "id",
        RELATORIO_ID,
        DESCRICAO,
        PARAMETRO,
        TIPO,
        STATUS,
        TIPO_PARAMETRO,
        TTITLE,
        ITENS,
        VALOR_PADRAO,
        CONSULTA,
        CAMPO,
        SQL,
        RECEBER_DO_USUARIO,
        VALOR,
        COMPRIMENTO,
        OBRIGATORIO,
        TIPO_SQL,
        SQL_LIKE,
        ORDEM,
        CODIGO
    )
    select
        gen_id(GTBRELATORIO_WEB_PARAMETRO, 1) id,
        :NEW_ID RELATORIO_ID,
        DESCRICAO,
        PARAMETRO,
        TIPO,
        STATUS,
        TIPO_PARAMETRO,
        TTITLE,
        ITENS,
        VALOR_PADRAO,
        CONSULTA,
        CAMPO,
        SQL,
        RECEBER_DO_USUARIO,
        VALOR,
        COMPRIMENTO,
        OBRIGATORIO,
        TIPO_SQL,
        SQL_LIKE,
        ORDEM,
        CODIGO
    from TBRELATORIO_WEB_PARAMETRO e where e.relatorio_id = :RELATORIO_ID;


    insert into TBRELATORIO_WEB_MENUS (ID,RELATORIO_WEB_ID,MENU_ID, CODIGO)
    select
        gen_id(GTBRELATORIO_WEB_MENUS, 1) id,:NEW_ID RELATORIO_WEB_ID,MENU_ID, CODIGO
    from TBRELATORIO_WEB_MENUS q where q.relatorio_web_id = :RELATORIO_ID;

    insert into TBRELATORIO_WEB_GRAFICO (
        ID,
        DESCRICAO,
        SCRIPT,
        RELATORIO_ID,
        CODIGO
    )
    select
        gen_id(GTBRELATORIO_WEB_GRAFICO, 1) id,
        DESCRICAO,
        SCRIPT,
        :NEW_ID RELATORIO_ID,
        CODIGO
    from TBRELATORIO_WEB_GRAFICO s
    where s.relatorio_id = :RELATORIO_ID;

    insert into TBRELATORIO_WEB_SERV (
        ID,
        RELATORIO_ID,
        CODIGO,
        SERVIDOR_ID
    )
    select
        gen_id(GTBRELATORIO_WEB_SERV, 1) id,
        :NEW_ID RELATORIO_ID,
        CODIGO,
        SERVIDOR_ID
    from TBRELATORIO_WEB_SERV s
    where s.relatorio_id = :RELATORIO_ID;

    UPDATE OR INSERT INTO TBRELATORIO_WEB_USUARIO (USUARIO_ID, RELATORIO_ID, CODIGO) VALUES (fn_current_user_id(), :NEW_ID, :CODIGO) MATCHING (USUARIO_ID, CODIGO);

   suspend;
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER function FN_RELATORIO_WEB_ID (
    PARTIDA integer = 0,
    TAG integer = 0)
returns integer
AS
declare variable MAX_ID integer;
declare variable EXISTE integer;
begin
  MAX_ID = 0;

  if(TAG < 100)then
  begin
      MAX_ID = coalesce((
        select first 1
            PROXIMO
        from(
            select
                codigo,
                LINHA,
                28000 + LINHA as PROXIMO,
                iif(codigo = (28000 + LINHA), 0, 1) as quebra
            from(
                select
                    codigo,
                    row_number() over(order by codigo) as LINHA
                from(
                    select distinct
                        e.codigo
                    from tbrelatorio_web e
                    where e.status = 1
                    order by e.codigo
                ) order by codigo
            ) order by codigo
        ) where quebra = 1 and PROXIMO > :PARTIDA
        order by codigo
      ),0);
      
      EXISTE = coalesce((select  first 1 1 from tbrelatorio_web e where e.codigo = :MAX_ID and e.status = 1),0);
    
      if(MAX_ID > 0)then
      begin
          if(EXISTE = 0)then
          begin
    
          end else
          begin
            MAX_ID = FN_RELATORIO_WEB_ID(:MAX_ID, TAG+1);
          end
      end else
      begin
          MAX_ID = coalesce((select max(codigo) + 1 from tbrelatorio_web e),0);
      end
  end

  return MAX_ID;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbrelatorio_web_bi for tbrelatorio_web
active before insert position 0
as
begin
  if (new.id is null) then
  begin
    new.id = gen_id(gtbrelatorio_web,1);
  end

  EXECUTE PROCEDURE SPI_HISTORICO('TBRELATORIO_WEB',NEW.ID, 'INSERIDO');
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrelatorio_web_b01u for tbrelatorio_web
active before update position 2
AS
begin
  if(new.VERSAO_IMP is distinct from old.versao_imp)then
  begin
       EXECUTE PROCEDURE SPI_HISTORICO('TBRELATORIO_WEB',NEW.ID, 'VERSAO: '||coalesce(old.versao_imp,0)||' -> '||coalesce(new.VERSAO_IMP,0));
  end

  if(new.codigo is distinct from old.codigo)then
  begin
        EXECUTE PROCEDURE SPI_HISTORICO('TBRELATORIO_WEB',NEW.ID, 'CODIGO: '||coalesce(old.codigo,0)||' -> '||coalesce(new.codigo,0));
    
        update tbrelatorio_web_conf      e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_detalhe   e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_grafico   e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_grupos    e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_parametro e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_serv      e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_sql       e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_usuario   e set e.codigo = new.codigo where e.relatorio_id     = new.codigo;
        update tbrelatorio_web_menus     e set e.codigo = new.codigo where e.relatorio_web_id = new.codigo;
  end
end
^

SET TERM ; ^

