
CREATE GENERATOR GTBUSUARIO_LOCALIZACAO;

CREATE TABLE TBUSUARIO_LOCALIZACAO (
    ID              INTEGER NOT NULL,
    USUARIO_ID      INTEGER,
    LOCALIZACAO_ID  INTEGER,
    FLAG            INTEGER
);

ALTER TABLE TBUSUARIO_LOCALIZACAO ADD CONSTRAINT PK_TBUSUARIO_LOCALIZACAO PRIMARY KEY (ID);


CREATE OR ALTER TRIGGER TBUSUARIO_LOCALIZACAO_BIUD0 FOR TBUSUARIO_LOCALIZACAO
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 0
AS
    declare variable idparan integer;
    declare variable qtd integer;
    declare variable flag integer;
    declare variable listaloc varchar(3000);
begin
    
    if(deleting)then
    begin
        flag = coalesce(old.flag,0);
    end else
    begin
        flag = coalesce(new.flag,0);
    end

    if(flag = 0)then
    begin
        /*
        qtd = 0;
    
        if(deleting)then
        begin
    
            select
                u.usuario_id as qtd,
                list(fn_lpad(u.localizacao_id,2,'0'),',') as LOCALIZACAO
            from (
                select
                    u.usuario_id,
                    u.localizacao_id
                from TBUSUARIO_LOCALIZACAO u
                where u.localizacao_id <> old.localizacao_id
                and u.usuario_id = old.usuario_id
                order by u.localizacao_id ascending
            ) u  group by u.usuario_id
            into :qtd, :listaloc;
    
            qtd = coalesce(qtd,0);
    
            --exception "..." listaloc;
    
            if(qtd > 0)then
            begin
               UPDATE OR INSERT INTO TBCONTROLE_USUARIO (USUARIO_ID, ID, VALOR_EXT) VALUES (old.usuario_id,127,:listaloc) MATCHING (USUARIO_ID, ID);
            end else
            begin
               UPDATE OR INSERT INTO TBCONTROLE_USUARIO (USUARIO_ID, ID, VALOR_EXT) VALUES (old.usuario_id,127,'') MATCHING (USUARIO_ID, ID);
            end
    
        end
    
        if(updating or inserting)then
        begin
    
            select
                u.usuario_id as qtd,
                list(fn_lpad(u.localizacao_id,2,'0'),',') as LOCALIZACAO
            from (
                select
                    u.usuario_id,
                    u.localizacao_id
                from TBUSUARIO_LOCALIZACAO u
                where u.localizacao_id <> new.localizacao_id
                and u.usuario_id = new.usuario_id
                order by u.localizacao_id ascending
            ) u  group by u.usuario_id
            into :qtd, :listaloc;
    
            qtd = coalesce(qtd,0);
    
            if(qtd = 0)then
            begin
                qtd = 1;
                listaloc = fn_lpad(new.localizacao_id,2,'0');
            end else
            begin
                listaloc = listaloc||','||fn_lpad(new.localizacao_id,2,'0');
            end
    
            --exception "..." listaloc;
    
            if(qtd > 0)then
            begin
               UPDATE OR INSERT INTO TBCONTROLE_USUARIO (USUARIO_ID, ID, VALOR_EXT) VALUES (new.usuario_id,127,:listaloc) MATCHING (USUARIO_ID, ID);
            end else
            begin
               UPDATE OR INSERT INTO TBCONTROLE_USUARIO (USUARIO_ID, ID, VALOR_EXT) VALUES (new.usuario_id,127,'') MATCHING (USUARIO_ID, ID);
            end
    
        end
        */
    end
end;


CREATE OR ALTER TRIGGER TTBUSUARIO_LOCALIZACAO_B01I FOR TBUSUARIO_LOCALIZACAO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbusuario_localizacao,1);
end;
