SET TERM ^ ;

CREATE OR ALTER function FN_TO_JSON (
    V00 blob sub_type 1 segment size 80 = '',
    V01 blob sub_type 1 segment size 80 = '',
    V02 blob sub_type 1 segment size 80 = '',
    V03 blob sub_type 1 segment size 80 = '',
    V04 blob sub_type 1 segment size 80 = '',
    V05 blob sub_type 1 segment size 80 = '',
    V06 blob sub_type 1 segment size 80 = '',
    V07 blob sub_type 1 segment size 80 = '',
    V08 blob sub_type 1 segment size 80 = '',
    V09 blob sub_type 1 segment size 80 = '',
    V10 blob sub_type 1 segment size 80 = '',
    V11 blob sub_type 1 segment size 80 = '',
    V12 blob sub_type 1 segment size 80 = '',
    V13 blob sub_type 1 segment size 80 = '',
    V14 blob sub_type 1 segment size 80 = '',
    V15 blob sub_type 1 segment size 80 = '',
    V16 blob sub_type 1 segment size 80 = '',
    V17 blob sub_type 1 segment size 80 = '',
    V18 blob sub_type 1 segment size 80 = '',
    V19 blob sub_type 1 segment size 80 = '')
returns blob sub_type 1 segment size 80
as
declare variable JSON blob sub_type 1 segment size 80;
begin
 JSON = blob_append(null, '');

 if(char_length(V00) > 0)then begin JSON = blob_append(JSON,',',V00); end
 if(char_length(V01) > 0)then begin JSON = blob_append(JSON,',',V01); end
 if(char_length(V02) > 0)then begin JSON = blob_append(JSON,',',V02); end
 if(char_length(V03) > 0)then begin JSON = blob_append(JSON,',',V03); end
 if(char_length(V04) > 0)then begin JSON = blob_append(JSON,',',V04); end
 if(char_length(V05) > 0)then begin JSON = blob_append(JSON,',',V05); end
 if(char_length(V06) > 0)then begin JSON = blob_append(JSON,',',V06); end
 if(char_length(V07) > 0)then begin JSON = blob_append(JSON,',',V07); end
 if(char_length(V08) > 0)then begin JSON = blob_append(JSON,',',V08); end
 if(char_length(V09) > 0)then begin JSON = blob_append(JSON,',',V09); end
 if(char_length(V10) > 0)then begin JSON = blob_append(JSON,',',V10); end
 if(char_length(V11) > 0)then begin JSON = blob_append(JSON,',',V11); end
 if(char_length(V12) > 0)then begin JSON = blob_append(JSON,',',V12); end
 if(char_length(V13) > 0)then begin JSON = blob_append(JSON,',',V13); end
 if(char_length(V14) > 0)then begin JSON = blob_append(JSON,',',V14); end
 if(char_length(V15) > 0)then begin JSON = blob_append(JSON,',',V15); end
 if(char_length(V16) > 0)then begin JSON = blob_append(JSON,',',V16); end
 if(char_length(V17) > 0)then begin JSON = blob_append(JSON,',',V17); end
 if(char_length(V18) > 0)then begin JSON = blob_append(JSON,',',V18); end
 if(char_length(V19) > 0)then begin JSON = blob_append(JSON,',',V19); end

 JSON = blob_append('{',JSON,'}');
 JSON = replace(JSON,'{,','{');
 JSON = replace(JSON,',}','}');

 return JSON;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_TO_JSON_V2 (
    V00 blob sub_type 1 segment size 80 = '',
    V01 blob sub_type 1 segment size 80 = '',
    V02 blob sub_type 1 segment size 80 = '',
    V03 blob sub_type 1 segment size 80 = '',
    V04 blob sub_type 1 segment size 80 = '',
    V05 blob sub_type 1 segment size 80 = '',
    V06 blob sub_type 1 segment size 80 = '',
    V07 blob sub_type 1 segment size 80 = '',
    V08 blob sub_type 1 segment size 80 = '',
    V09 blob sub_type 1 segment size 80 = '',
    V10 blob sub_type 1 segment size 80 = '',
    V11 blob sub_type 1 segment size 80 = '',
    V12 blob sub_type 1 segment size 80 = '',
    V13 blob sub_type 1 segment size 80 = '',
    V14 blob sub_type 1 segment size 80 = '',
    V15 blob sub_type 1 segment size 80 = '',
    V16 blob sub_type 1 segment size 80 = '',
    V17 blob sub_type 1 segment size 80 = '',
    V18 blob sub_type 1 segment size 80 = '',
    V19 blob sub_type 1 segment size 80 = '')
returns blob sub_type 1 segment size 80
as
declare variable JSON blob sub_type 1 segment size 80;
begin
 JSON = blob_append(null, '');

 if(char_length(V00) > 0)then begin JSON = blob_append(JSON,',',V00); end
 if(char_length(V01) > 0)then begin JSON = blob_append(JSON,',',V01); end
 if(char_length(V02) > 0)then begin JSON = blob_append(JSON,',',V02); end
 if(char_length(V03) > 0)then begin JSON = blob_append(JSON,',',V03); end
 if(char_length(V04) > 0)then begin JSON = blob_append(JSON,',',V04); end
 if(char_length(V05) > 0)then begin JSON = blob_append(JSON,',',V05); end
 if(char_length(V06) > 0)then begin JSON = blob_append(JSON,',',V06); end
 if(char_length(V07) > 0)then begin JSON = blob_append(JSON,',',V07); end
 if(char_length(V08) > 0)then begin JSON = blob_append(JSON,',',V08); end
 if(char_length(V09) > 0)then begin JSON = blob_append(JSON,',',V09); end
 if(char_length(V10) > 0)then begin JSON = blob_append(JSON,',',V10); end
 if(char_length(V11) > 0)then begin JSON = blob_append(JSON,',',V11); end
 if(char_length(V12) > 0)then begin JSON = blob_append(JSON,',',V12); end
 if(char_length(V13) > 0)then begin JSON = blob_append(JSON,',',V13); end
 if(char_length(V14) > 0)then begin JSON = blob_append(JSON,',',V14); end
 if(char_length(V15) > 0)then begin JSON = blob_append(JSON,',',V15); end
 if(char_length(V16) > 0)then begin JSON = blob_append(JSON,',',V16); end
 if(char_length(V17) > 0)then begin JSON = blob_append(JSON,',',V17); end
 if(char_length(V18) > 0)then begin JSON = blob_append(JSON,',',V18); end
 if(char_length(V19) > 0)then begin JSON = blob_append(JSON,',',V19); end

 JSON = blob_append('{',JSON,'}');
 JSON = replace(JSON,'{,','{');
 JSON = replace(JSON,',}','}');

 return coalesce(JSON,'{}');
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER function FN_TO_JSON_V3 (
    V00 blob sub_type 1 segment size 80 = '',
    V01 blob sub_type 1 segment size 80 = '',
    V02 blob sub_type 1 segment size 80 = '',
    V03 blob sub_type 1 segment size 80 = '',
    V04 blob sub_type 1 segment size 80 = '',
    V05 blob sub_type 1 segment size 80 = '',
    V06 blob sub_type 1 segment size 80 = '',
    V07 blob sub_type 1 segment size 80 = '',
    V08 blob sub_type 1 segment size 80 = '',
    V09 blob sub_type 1 segment size 80 = '',
    V10 blob sub_type 1 segment size 80 = '',
    V11 blob sub_type 1 segment size 80 = '',
    V12 blob sub_type 1 segment size 80 = '',
    V13 blob sub_type 1 segment size 80 = '',
    V14 blob sub_type 1 segment size 80 = '',
    V15 blob sub_type 1 segment size 80 = '',
    V16 blob sub_type 1 segment size 80 = '',
    V17 blob sub_type 1 segment size 80 = '',
    V18 blob sub_type 1 segment size 80 = '',
    V19 blob sub_type 1 segment size 80 = '',
    V20 blob sub_type 1 segment size 80 = '',
    V21 blob sub_type 1 segment size 80 = '',
    V22 blob sub_type 1 segment size 80 = '',
    V23 blob sub_type 1 segment size 80 = '',
    V24 blob sub_type 1 segment size 80 = '',
    V25 blob sub_type 1 segment size 80 = '',
    V26 blob sub_type 1 segment size 80 = '',
    V27 blob sub_type 1 segment size 80 = '',
    V28 blob sub_type 1 segment size 80 = '',
    V29 blob sub_type 1 segment size 80 = '',
    V30 blob sub_type 1 segment size 80 = '',
    V31 blob sub_type 1 segment size 80 = '',
    V32 blob sub_type 1 segment size 80 = '',
    V33 blob sub_type 1 segment size 80 = '',
    V34 blob sub_type 1 segment size 80 = '',
    V35 blob sub_type 1 segment size 80 = '',
    V36 blob sub_type 1 segment size 80 = '',
    V37 blob sub_type 1 segment size 80 = '',
    V38 blob sub_type 1 segment size 80 = '',
    V39 blob sub_type 1 segment size 80 = '',
    V40 blob sub_type 1 segment size 80 = '',
    V41 blob sub_type 1 segment size 80 = '',
    V42 blob sub_type 1 segment size 80 = '',
    V43 blob sub_type 1 segment size 80 = '',
    V44 blob sub_type 1 segment size 80 = '',
    V45 blob sub_type 1 segment size 80 = '',
    V46 blob sub_type 1 segment size 80 = '',
    V47 blob sub_type 1 segment size 80 = '',
    V48 blob sub_type 1 segment size 80 = '',
    V49 blob sub_type 1 segment size 80 = '')
returns blob sub_type 1 segment size 80
as
declare variable JSON blob sub_type 1 segment size 80;
begin
 JSON = blob_append(null, '');

 if(char_length(V00) > 0)then begin JSON = blob_append(JSON, ',', V00); end
 if(char_length(V01) > 0)then begin JSON = blob_append(JSON, ',', V01); end
 if(char_length(V02) > 0)then begin JSON = blob_append(JSON, ',', V02); end
 if(char_length(V03) > 0)then begin JSON = blob_append(JSON, ',', V03); end
 if(char_length(V04) > 0)then begin JSON = blob_append(JSON, ',', V04); end
 if(char_length(V05) > 0)then begin JSON = blob_append(JSON, ',', V05); end
 if(char_length(V06) > 0)then begin JSON = blob_append(JSON, ',', V06); end
 if(char_length(V07) > 0)then begin JSON = blob_append(JSON, ',', V07); end
 if(char_length(V08) > 0)then begin JSON = blob_append(JSON, ',', V08); end
 if(char_length(V09) > 0)then begin JSON = blob_append(JSON, ',', V09); end
 if(char_length(V10) > 0)then begin JSON = blob_append(JSON, ',', V10); end
 if(char_length(V11) > 0)then begin JSON = blob_append(JSON, ',', V11); end
 if(char_length(V12) > 0)then begin JSON = blob_append(JSON, ',', V12); end
 if(char_length(V13) > 0)then begin JSON = blob_append(JSON, ',', V13); end
 if(char_length(V14) > 0)then begin JSON = blob_append(JSON, ',', V14); end
 if(char_length(V15) > 0)then begin JSON = blob_append(JSON, ',', V15); end
 if(char_length(V16) > 0)then begin JSON = blob_append(JSON, ',', V16); end
 if(char_length(V17) > 0)then begin JSON = blob_append(JSON, ',', V17); end
 if(char_length(V18) > 0)then begin JSON = blob_append(JSON, ',', V18); end
 if(char_length(V19) > 0)then begin JSON = blob_append(JSON, ',', V19); end
 if(char_length(V20) > 0)then begin JSON = blob_append(JSON, ',', V20); end
 if(char_length(V21) > 0)then begin JSON = blob_append(JSON, ',', V21); end
 if(char_length(V22) > 0)then begin JSON = blob_append(JSON, ',', V22); end
 if(char_length(V23) > 0)then begin JSON = blob_append(JSON, ',', V23); end
 if(char_length(V24) > 0)then begin JSON = blob_append(JSON, ',', V24); end
 if(char_length(V25) > 0)then begin JSON = blob_append(JSON, ',', V25); end
 if(char_length(V26) > 0)then begin JSON = blob_append(JSON, ',', V26); end
 if(char_length(V27) > 0)then begin JSON = blob_append(JSON, ',', V27); end
 if(char_length(V28) > 0)then begin JSON = blob_append(JSON, ',', V28); end
 if(char_length(V29) > 0)then begin JSON = blob_append(JSON, ',', V29); end
 if(char_length(V30) > 0)then begin JSON = blob_append(JSON, ',', V30); end
 if(char_length(V31) > 0)then begin JSON = blob_append(JSON, ',', V31); end
 if(char_length(V32) > 0)then begin JSON = blob_append(JSON, ',', V32); end
 if(char_length(V33) > 0)then begin JSON = blob_append(JSON, ',', V33); end
 if(char_length(V34) > 0)then begin JSON = blob_append(JSON, ',', V34); end
 if(char_length(V35) > 0)then begin JSON = blob_append(JSON, ',', V35); end
 if(char_length(V36) > 0)then begin JSON = blob_append(JSON, ',', V36); end
 if(char_length(V37) > 0)then begin JSON = blob_append(JSON, ',', V37); end
 if(char_length(V38) > 0)then begin JSON = blob_append(JSON, ',', V38); end
 if(char_length(V39) > 0)then begin JSON = blob_append(JSON, ',', V39); end
 if(char_length(V40) > 0)then begin JSON = blob_append(JSON, ',', V40); end
 if(char_length(V41) > 0)then begin JSON = blob_append(JSON, ',', V41); end
 if(char_length(V42) > 0)then begin JSON = blob_append(JSON, ',', V42); end
 if(char_length(V43) > 0)then begin JSON = blob_append(JSON, ',', V43); end
 if(char_length(V44) > 0)then begin JSON = blob_append(JSON, ',', V44); end
 if(char_length(V45) > 0)then begin JSON = blob_append(JSON, ',', V45); end
 if(char_length(V46) > 0)then begin JSON = blob_append(JSON, ',', V46); end
 if(char_length(V47) > 0)then begin JSON = blob_append(JSON, ',', V47); end
 if(char_length(V48) > 0)then begin JSON = blob_append(JSON, ',', V48); end
 if(char_length(V49) > 0)then begin JSON = blob_append(JSON, ',', V49); end

 JSON = blob_append('{',JSON,'}');
 JSON = replace(JSON,'{,','{');
 JSON = replace(JSON,',}','}');

 return coalesce(JSON,'{}');
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_TO_OBJ_JSON (
    CAMPO varchar(50),
    VALOR blob sub_type 1 segment size 80)
returns blob sub_type 1 segment size 80
AS
begin
  return blob_append('"',CAMPO,'":', coalesce(VALOR,''));
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER function FN_TO_PAR_JSON (
    CAMPO varchar(50),
    VALOR blob sub_type 1 segment size 80)
returns blob sub_type 1 segment size 80
AS
begin
  return blob_append('"',CAMPO,'":"',coalesce(VALOR,''),'"');
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_TO_PAR_JSON_V2 (
    CAMPO varchar(50),
    VALOR blob sub_type 1 segment size 80)
returns blob sub_type 1 segment size 80
AS
begin
  return blob_append('"',CAMPO,'":"',replace(replace(replace(replace(coalesce(VALOR,''),'"',''),'"',''),'"',''),'"',''),'"');
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_TO_PAR_JSON_V3 (
    CAMPO varchar(50),
    VALOR blob sub_type 1 segment size 80)
returns blob sub_type 1 segment size 80
AS
begin
  return blob_append('"',CAMPO,'":"',replace(replace(replace(replace(replace(replace(replace(replace(coalesce(VALOR,''),'"',''),'"',''),'"',''),'"',''),'\','/'),'\','/'),'\','/'),'\','/'),'"');
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_CAPITALIZE (
    TEXTO blob sub_type 1 segment size 80,
    REPLACE_FOR integer = 0)
returns blob sub_type 1 segment size 80
AS
DECLARE VARIABLE SAIDA BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE PRIMEIRO BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE RESTANTE BLOB SUB_TYPE 1 SEGMENT SIZE 80;
begin
    TEXTO = replace(trim(TEXTO),'  ',' ');

    IF ( REPLACE_FOR = 1 ) THEN
    BEGIN
        TEXTO = REPLACE(TEXTO,'_',' ');
        TEXTO = SUBSTRING(TEXTO FROM 3);
    END

    SAIDA = '';
    FOR
    select osplit
    from split(:TEXTO,' ')
    into texto
    do
    BEGIN
        PRIMEIRO = UPPER(SUBSTRING(TEXTO FROM 1 FOR 1));
        RESTANTE = LOWER(SUBSTRING(TEXTO FROM 2));
        SAIDA = blob_append(SAIDA,' ',PRIMEIRO,RESTANTE);
    END

  return TRIM(SAIDA);
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER function FN_DRE_EXECUTE_CALC (
    ANO integer,
    MES integer,
    SQL blob sub_type 0 segment size 80 = '0')
returns numeric(15,4)
AS
declare variable valor numeric(15,4);
declare variable v1 numeric(15,4);
declare variable v2 numeric(15,4);
declare variable v3 numeric(15,4);
begin
   V1 = 0;
   V2 = 0;
   V3 = 0;

   :SQL = replace(:SQL,':MES'    ,:MES   );
   :SQL = replace(:SQL,':ANO'    ,:ANO   );

   :V1  = FN_EXECUTE_CALC(blob_append('(',:SQL,')'));

   VALOR = V1 + V2 + V3;

   return coalesce(VALOR,0);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_DRE_EXECUTE_CALC_V2 (
    ANO integer,
    MES integer,
    SQL blob sub_type 0 segment size 80 = '0')
returns numeric(15,4)
AS
declare variable valor numeric(15,4);
declare variable v1 numeric(15,4);
declare variable v2 numeric(15,4);
declare variable v3 numeric(15,4);
begin
   V1 = 0;
   V2 = 0;
   V3 = 0;

   :SQL = replace(:SQL,':MES'    ,:MES   );
   :SQL = replace(:SQL,':ANO'    ,:ANO   );

   :V1  = FN_EXECUTE_CALC(blob_append('(',:SQL,')'));

   VALOR = V1 + V2 + V3;

   return coalesce(VALOR,0);

   WHEN ANY DO
      BEGIN
         return 0;
      END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_DRE_LANCAMENTOS (
    ID integer,
    CONTA varchar(20),
    ANO integer,
    MES integer,
    TIPO integer,
    NATUREZA_SERVICO varchar(10),
    USAR_REGRA_COMERCIAL integer = 0,
    USAR_REGRA_SERVICOS integer = 0,
    SQL blob sub_type 0 segment size 80 = '0',
    TIPO2 integer = 0)
returns numeric(15,4)
AS
declare variable valor numeric(15,4);
declare variable v1 numeric(15,4);
declare variable v2 numeric(15,4);
declare variable v3 numeric(15,4);
declare variable extra numeric(15,4);
begin
   V1 = 0;
   V2 = 0;
   V3 = 0;

   if(USAR_REGRA_COMERCIAL = 0 and (TIPO = 1 or TIPO = 3))then
   begin
       V1 = coalesce((
                select
                    sum(valor) as valor
                from(
                    select
                        sum(iif(m.natureza = 'D', m.valor * -1, m.valor)) as valor
                    from tbmovcontabil m
                    where m.ano = :ANO
                    and m.mes   = :MES
                    and m.conta = :CONTA
                    and m.tipolanc <> 'E'
    
                    union all
    
                    select
                        sum(e.valor) * -1 as valor
                    from TBMOVCONTABIL_DRE e
                    where e.ano = :ANO
                    and e.mes   = :MES
                    and e.conta = :CONTA
                )
            ),0);
   end

   if(USAR_REGRA_SERVICOS = 0 and (TIPO = 2 or TIPO = 3))then
   begin
       V2 = coalesce((
                select sum(b.valor * iif(:NATUREZA_SERVICO = 'D', -1, 1))
                from tbccusto_cota a, tbccusto_cota_outros b
                where a.id = b.ccusto_cota_id
                and b.statusexclusao = '0'
                and a.statusexclusao = '0'
                and a.ano = :ANO
                and a.mes = :MES
                and b.contacontabil_dre = :CONTA
            ),0);
   end

   if(USAR_REGRA_COMERCIAL = 1 and (TIPO = 1 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'    ,:MES   );
       :SQL = replace(:SQL,':ANO'    ,:ANO   );
       :SQL = replace(:SQL,':CONTA'  ,:CONTA );
       :SQL = replace(:SQL,':CCUSTO' ,'''''' );

       :V1  = FN_EXECUTE_CALC_V3(blob_append('coalesce((',:SQL,'),0)')) * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   if(USAR_REGRA_SERVICOS = 1 and (TIPO = 2 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'    ,:MES   );
       :SQL = replace(:SQL,':ANO'    ,:ANO   );
       :SQL = replace(:SQL,':CONTA'  ,:CONTA );
       :SQL = replace(:SQL,':CCUSTO' ,'''''' );

       :V2  = FN_EXECUTE_CALC_V3(blob_append('coalesce((',:SQL,'),0)')) * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   EXTRA = 0;

   if(TIPO = 1 or TIPO = 3)then
   begin
        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.comercial  = 1
                and m.tipo_conta = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.comercial  = 1
                and m.tipo_conta = 2
            ),0);
   end

   if(TIPO = 2 or TIPO = 3)then
   begin
        EXTRA = EXTRA + coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.servicos   = 1
                and m.tipo_conta = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.servicos   = 1
                and m.tipo_conta = 2
            ),0);
   end

   if(TIPO2 > 0)then
   begin

        EXTRA = EXTRA + coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano        = :ANO
                and m.mes          = :MES
                and m.conta        = :CONTA
                and m.consolidado  = 1
                and m.tipo_conta   = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano       = :ANO
                and m.mes         = :MES
                and m.conta       = :ID
                and m.consolidado = 1
                and m.tipo_conta  = 2
            ),0);
   end

   VALOR = V1 + V2 + V3 + EXTRA;

   return VALOR;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_DRE_LANCAMENTOS_RAT (
    CCUSTO varchar(20),
    ID integer,
    CONTA varchar(20),
    ANO integer,
    MES integer,
    TIPO integer,
    NATUREZA_SERVICO varchar(10),
    USAR_REGRA_COMERCIAL integer = 0,
    USAR_REGRA_SERVICOS integer = 0,
    SQL blob sub_type 0 segment size 80 = '0',
    TIPO2 integer = 0)
returns numeric(15,4)
AS
declare variable valor numeric(15,4);
declare variable v1 numeric(15,4);
declare variable v2 numeric(15,4);
declare variable v3 numeric(15,4);
declare variable extra numeric(15,4);
begin
   V1 = 0;
   V2 = 0;
   V3 = 0;

   if(USAR_REGRA_COMERCIAL = 0 and (TIPO = 1 or TIPO = 3))then
   begin

        V1 = coalesce((
            select
                cast(sum(h.valor) as numeric(15,4))as valor
            from TBRATEAMENTO_DETALHE h, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c , TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND  c.ccusto_id like :CCUSTO) b
            where h.ano     = :ANO
            and   h.mes     = :MES
            and   h.origem  = :CONTA
            and   h.SERVICO = 0
            and   h.grupo_rateamento = 2
            and   h.ccusto like b.CCUSTO
            /*
            and (
                h.ccusto like '21%' or
                h.ccusto like '22%' or
                h.ccusto like '61%' or
                h.ccusto like '97%'
            )*/
    
        ),0) * -1;

   end

   if(USAR_REGRA_SERVICOS = 0 and (TIPO = 2 or TIPO = 3))then
   begin
       V2 = coalesce((
                /*
                select
                    sum(h.valor * iif(:NATUREZA_SERVICO = 'D', -1, 1))
                from TBDESPESA_HISTORICO h
                where h.ano     = :ANO
                and   h.mes     = :MES
                and   h.conta   = :CONTA
                and   h.SERVICO = 1
                and   h.grupo_rateamento = 2
                */

                select
                    sum(h.valor * iif(:NATUREZA_SERVICO = 'D', -1, 1))
                from TBRATEAMENTO_DETALHE h, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c , TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND  c.ccusto_id like :CCUSTO) b
                where h.ano     = :ANO
                and   h.mes     = :MES
                and   h.origem  = :CONTA
                and   h.SERVICO = 1
                and   h.grupo_rateamento = 2
                and   h.ccusto like b.CCUSTO
                    
            ),0);
   end

   if(USAR_REGRA_COMERCIAL = 1 and (TIPO = 1 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'     ,:MES   );
       :SQL = replace(:SQL,':ANO'     ,:ANO   );
       :SQL = replace(:SQL,':CONTA'   ,:CONTA );
       :SQL = replace(:SQL,':CCUSTO'  , ''''||fn_replace(:CCUSTO,'%|*','','|')||'''');
       :SQL = replace(:SQL,'''''''''' , '''''');

       --exception "..." :SQL;

       :V1  = FN_EXECUTE_CALC_V3(blob_append('coalesce((',:SQL,'),0)')) * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   if(USAR_REGRA_SERVICOS = 1 and (TIPO = 2 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'    ,:MES   );
       :SQL = replace(:SQL,':ANO'    ,:ANO   );
       :SQL = replace(:SQL,':CONTA'  ,:CONTA );
       :SQL = replace(:SQL,':CCUSTO' , ''''||fn_replace(:CCUSTO,'%|*','','|')||'''');
       :SQL = replace(:SQL,'''''''''' , '''''');

       --exception "..." :SQL;

       :V2  = FN_EXECUTE_CALC_V3(blob_append('coalesce((',:SQL,'),0)')) * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   EXTRA = 0;

   if(TIPO = 1 or TIPO = 3)then
   begin
        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c , TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND  c.ccusto_id like :CCUSTO) b
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.comercial  = 1
                and m.tipo_conta = 1
                and m.ccusto like b.CCUSTO
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c , TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND  c.ccusto_id like :CCUSTO) b
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.comercial  = 1
                and m.tipo_conta = 2
                and m.ccusto like b.CCUSTO
            ),0);
   end

   if(TIPO = 2 or TIPO = 3)then
   begin
        EXTRA = EXTRA + coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c , TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND  c.ccusto_id like :CCUSTO) b
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.servicos   = 1
                and m.tipo_conta = 1 
                and m.ccusto like b.CCUSTO
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c, TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND c.ccusto_id like :CCUSTO) b
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.servicos   = 1
                and m.tipo_conta = 2
                and m.ccusto like b.CCUSTO
            ),0);
   end

   if(TIPO2 > 0)then
   begin

        EXTRA = EXTRA + coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c, TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND c.ccusto_id like :CCUSTO) b
                where m.ano        = :ANO
                and m.mes          = :MES
                and m.conta        = :CONTA
                and m.consolidado  = 1
                and m.tipo_conta   = 1
                and m.ccusto like b.CCUSTO
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m, (select distinct c.ccusto_id||'%' as CCUSTO from vwcentro_negocio_ccusto c, TBCENTRO_NEGOCIO A where A.id = C.centro_negocio_id AND A.status = 1 AND c.ccusto_id like :CCUSTO) b
                where m.ano       = :ANO
                and m.mes         = :MES
                and m.conta       = :ID
                and m.consolidado = 1
                and m.tipo_conta  = 2
                and m.ccusto like b.CCUSTO
            ),0);
   end

   VALOR = coalesce(V1,0) + coalesce(V2,0) + coalesce(V3,0) + coalesce(EXTRA,0);

   --exception "..." coalesce(V1,0)||' | '||coalesce(V2,0)||' | '||coalesce(V3,0)||' | '||coalesce(EXTRA,0);

   return VALOR;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_DRE_LANCAMENTOS_T (
    ID integer,
    CONTA varchar(20),
    ANO integer,
    MES integer,
    TIPO integer,
    NATUREZA_SERVICO varchar(10),
    USAR_REGRA_COMERCIAL integer = 0,
    USAR_REGRA_SERVICOS integer = 0,
    SQL blob sub_type 0 segment size 80 = '0',
    TIPO2 integer = 0)
returns numeric(15,4)
AS
declare variable valor numeric(15,4);
declare variable v1 numeric(15,4);
declare variable v2 numeric(15,4);
declare variable v3 numeric(15,4);
declare variable extra numeric(15,4);
begin
   V1 = 0;
   V2 = 0;
   V3 = 0;

   if(USAR_REGRA_COMERCIAL = 0 and (TIPO = 1 or TIPO = 3))then
   begin
       V1 = coalesce((
                select
                    sum(valor) as valor
                from(
                    select
                        sum(iif(m.natureza = 'D', m.valor * -1, m.valor)) as valor
                    from tbmovcontabil m
                    where m.ano = :ANO
                    and m.mes   = :MES
                    and m.conta = :CONTA
                    and m.tipolanc <> 'E'
    
                    union all
    
                    select
                        sum(e.valor) * -1 as valor
                    from TBMOVCONTABIL_DRE e
                    where e.ano = :ANO
                    and e.mes   = :MES
                    and e.conta = :CONTA
                )
            ),0);
   end

   if(USAR_REGRA_SERVICOS = 0 and (TIPO = 2 or TIPO = 3))then
   begin
       V2 = coalesce((
                select sum(b.valor * iif(:NATUREZA_SERVICO = 'D', -1, 1))
                from tbccusto_cota a, tbccusto_cota_outros b
                where a.id = b.ccusto_cota_id
                and b.statusexclusao = '0'
                and a.statusexclusao = '0'
                and a.ano = :ANO
                and a.mes = :MES
                and b.contacontabil_dre = :CONTA
            ),0);
   end

   if(USAR_REGRA_COMERCIAL = 1 and (TIPO = 1 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'    ,:MES   );
       :SQL = replace(:SQL,':ANO'    ,:ANO   );
       :SQL = replace(:SQL,':CONTA'  ,:CONTA );
       :SQL = replace(:SQL,':CCUSTO' ,'''''' );

       :V1  = FN_EXECUTE_CALC(blob_append('coalesce((',:SQL,'),0)')) * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   if(USAR_REGRA_SERVICOS = 1 and (TIPO = 2 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'    ,:MES   );
       :SQL = replace(:SQL,':ANO'    ,:ANO   );
       :SQL = replace(:SQL,':CONTA'  ,:CONTA );
       :SQL = replace(:SQL,':CCUSTO' ,'''''' );

       :V2  = FN_EXECUTE_CALC(blob_append('coalesce((',:SQL,'),0)')) * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   EXTRA = 0;

   if(TIPO = 1 or TIPO = 3)then
   begin
        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.comercial  = 1
                and m.tipo_conta = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.comercial  = 1
                and m.tipo_conta = 2
            ),0);
   end

   if(TIPO = 2 or TIPO = 3)then
   begin
        EXTRA = EXTRA + coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.servicos   = 1
                and m.tipo_conta = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.servicos   = 1
                and m.tipo_conta = 2
            ),0);
   end

   if(TIPO2 > 0)then
   begin

        EXTRA = EXTRA + coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano        = :ANO
                and m.mes          = :MES
                and m.conta        = :CONTA
                and m.consolidado  = 1
                and m.tipo_conta   = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano       = :ANO
                and m.mes         = :MES
                and m.conta       = :ID
                and m.consolidado = 1
                and m.tipo_conta  = 2
            ),0);
   end

   VALOR = V1 + V2 + V3 + EXTRA;

   return VALOR;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_ELIPSE2 (
    TEXTO blob sub_type 1 segment size 80,
    CARACTERES_MAXIMO integer = 30)
returns varchar(7000)
AS
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE TEXTO_CORTADO blob sub_type 1 segment size 80;
BEGIN

    TAMANHO = CHAR_LENGTH(TEXTO);
    TEXTO_CORTADO = TRIM(SUBSTRING(TEXTO FROM 1 FOR CARACTERES_MAXIMO-3));

    IF ( TAMANHO > CARACTERES_MAXIMO ) THEN
    BEGIN
        TEXTO = blob_append(TEXTO_CORTADO,'...');
    END

    RETURN TEXTO;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_EXECUTE_SQL (
    CALC blob sub_type 1 segment size 80)
returns blob sub_type 1 segment size 80
AS
begin

    EXECUTE STATEMENT blob_append('SELECT FIRST 1 (',CALC,') FROM RDB$DATABASE') INTO CALC;
    RETURN CALC;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_LINE (
    LINHAS integer = 1,
    CARACTERE varchar(50) = '')
returns blob sub_type 1 segment size 80
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE RET BLOB SUB_TYPE 1 SEGMENT SIZE 80;
BEGIN

    RET = '';
    I = 0;
    WHILE ( I < LINHAS ) DO
    BEGIN
        I = I+1;
        RET = blob_append(RET,CARACTERE,ASCII_CHAR(13),ASCII_CHAR(10));
    END
    
  RETURN RET;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger dlf_ttbestoque_trans_item_a2i for tbestoque_transacao_item
active before insert position 2
AS
declare variable DATAHORA TIMESTAMP;
declare variable USUARIO VARCHAR(200);
declare variable OPERACAO VARCHAR(144);
declare variable PRODUTO VARCHAR(436); 
declare variable QUANTIDADE NUMERIC(18,5); 
declare variable MOTIVO VARCHAR(80);
declare variable OBSERVACAO VARCHAR(400);

declare variable USUARIO_ID integer;
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(500);
declare variable ASSUNTO varchar(500);
declare variable ASSUNTO_EMAIL varchar(500);
declare variable CORPO blob sub_type 1 segment size 80;

declare variable notificar_email integer;
declare variable notificar_web integer;
begin

  if ((new.tipo = 'S' and new.localizacao_codigo = 20 and new.operacao_codigo = 'SPD' and new.motivo_baixa_id > 0)  or
      (new.tipo = 'S' and new.localizacao_codigo = 20 and new.operacao_codigo = 'SIR')  or
      (new.tipo = 'S' and new.localizacao_codigo = 20 and new.operacao_codigo = 'SRP')) then
        begin

                :USUARIO  = (SELECT FIRST 1 NOME FROM TBUSUARIO  WHERE CODIGO = NEW.USUARIO_CODIGO);
                :OPERACAO = (SELECT FIRST 1 CODIGO||' - '||DESCRICAO FROM TBOPERACAO WHERE CODIGO = NEW.OPERACAO_CODIGO);
                :PRODUTO  = (SELECT FIRST 1 LPAD(CODIGO,6,'0')||' - '||DESCRICAO FROM TBPRODUTO  WHERE CODIGO = NEW.PRODUTO_CODIGO);
                :MOTIVO   = (SELECT FIRST 1 DESCRICAO FROM TBSOBRA_SAIDA_MOTIVO WHERE ID = NEW.MOTIVO_BAIXA_ID);
                :DATAHORA = NEW.DATAHORA;
                :QUANTIDADE = NEW.QUANTIDADE;
                :OBSERVACAO = NEW.OBSERVACAO;

                USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
                MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
                OBSERVACAO      = FN_CAMEL_CASE(coalesce(OBSERVACAO, ''));
                --PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
                --OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
        
                notificar_email = coalesce(notificar_email, 0);
                notificar_web   = coalesce(notificar_web, 0);
            
                ASSUNTO = 'Baixa Avulsa de Bloco de Espuma';
                ASSUNTO_EMAIL = 'Baixa Avulsa de Bloco de Espuma - '||PRODUTO;
            
                CORPO = blob_append(null, '<div style="display: -webkit-inline-box;">');
                CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Data/Hora:</span>',fn_timestamp_to_string(DATAHORA),'<br>');
                CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Usuario:</span>',USUARIO,'<br>');
                CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Operação:</span> ',OPERACAO,'<br>');
                CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Produto:</span> ',PRODUTO,'<br>');
                CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Quant:</span> ',QUANTIDADE,'<br>');
                CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Motivo:</span> ',MOTIVO,'<br>');
                CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Observação:</span> ',OBSERVACAO,'<br>');
                CORPO = blob_append(CORPO,'</div>');

                  FOR
                    SELECT U.CODIGO, U.EMAIL FROM TBUSUARIO U WHERE U.SETOR = 'PCP' AND U.STATUS = '1'
                     INTO :USUARIO_ID, :DESTINATARIO
                     DO BEGIN
                            EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
            
                            INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                               VALUES (
                                1,
                                :usuario_id,
                                0,
                                0,
                                :ASSUNTO,
                                0,
                                0,
                                current_timestamp,
                                fn_current_user_id(),
                                current_timestamp,
                                0,
                                '',
                                0,
                                :CORPO);
            
                            INSERT INTO TBEMAIL (
                                ID,
                                EMAIL,
                                USUARIO_ID,
                                ASSUNTO,
                                CORPO,
                                STATUS,
                                DATAHORA,
                                MODULO_EMAIL
                            ) VALUES (
                                :EMAIL_ID,
                                :DESTINATARIO,
                                0,
                                :ASSUNTO_email,
                                :CORPO,
                                0,
                                CURRENT_TIMESTAMP,
                                16
                            );
            
                       END
            
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbocorrencia_web_freed_b03i for tbocorrencia_web_freed
active before insert position 3
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable linha integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable motivo_descricao varchar(300);
declare variable usuario_abertura varchar(300);
declare variable usuario_email varchar(100);
begin

    if(new.origem = 1 and new.usuario_id > 0)then
    begin

        html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
        html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);

        select
            e.tipo_id,
            e.assunto,
            e.descricao,
            fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
            s.campos_tabela_web,
            s.campos_sql_web,
            s.descricao_web,
            --t.descricao,
            m.descricao,
            --t.email,
            coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = e.usuario_id),'') as usuario_abertura
        from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
        where e.id = new.ocorrencia_web_id
        and s.ocorrencia_web_tipo_id = e.tipo_id
        and t.id = e.tipo_id
        and m.id = e.motivo_id
        into
            :tipo,
            :assunto,
            :descricao,
            :json,
            :campos_tabela_web,
            :campos_sql_web,
            :descricao_web,
            --:tipo_descricao,
            :motivo_descricao,
            --:email,
            :usuario_abertura;

        corpo1 = blob_append(null, '');
        corpo2 = blob_append(null, '');
        corpo3 = blob_append(null, '');
        
        corpo1 = blob_append(corpo1,'<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1,'<p>',new.mensagem,'</p>');
        corpo1 = blob_append(corpo1,'<br>Feed aberto por: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_id),''),'<br>');
        corpo1 = blob_append(corpo1,'<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_26110?TIPO=',:tipo,'&ID=',new.ocorrencia_web_id,'" target="_blank">[ABRIR OCORRENCIA NA WEB]</a></p>');
        corpo1 = blob_append(corpo1,'<br>');
        corpo1 = blob_append(corpo1,html1);
        
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>Ocorrencia aberta por ',:usuario_abertura,':</u></p>');
        corpo2 = blob_append(corpo2,'<p><u>Assunto</u>: ',:assunto,'</p>');
        corpo2 = blob_append(corpo2,'<p><u>Descricao</u>: ',:descricao,'</p>');
        corpo2 = blob_append(corpo2,'<br>');
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>',:descricao_web,'</u></p>');

        for
          select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
        into
          :campo,
          :linha
        do begin
          corpo2 = blob_append(corpo2,'<p><u>', FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ,'</u>: '||fn_json_v3(:json, :campo),'</p>');
        end

        corpo3 = blob_append(corpo3 , html2 , '</body></html>');

        id = Gen_ID(gtbemail,1);
        :USUARIO_EMAIL = COALESCE((SELECT FIRST 1 TIP.EMAIL_RECEBIMENTO FROM TBOCORRENCIA_WEB_TIPO TIP WHERE TIP.ID = COALESCE((SELECT FIRST 1 OCW.TIPO_ID FROM TBOCORRENCIA_WEB OCW WHERE OCW.ID = NEW.OCORRENCIA_WEB_ID), 0)), NULL);

        if(blob_append(:corpo1 , :corpo2 , :corpo3) <> '' and char_length(new.para) > 0)then
        begin

            insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, MODULO_EMAIL, OCORRENCIA_ID, OCORRENCIA_FEED_ID)
               values (
                :id,
                0,
                new.para,
                :descricao_web ||' [OCORRENCIA:'||lpad(new.ocorrencia_web_id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
                blob_append(:corpo1 , :corpo2 , :corpo3),
                new.usuario_id,
                new.em_copia,
                new.em_copia_oculta,
                0,
                current_timestamp,
                :USUARIO_EMAIL,
                1, 
				COALESCE((SELECT FIRST 1 OCW.TIPO_ID FROM TBOCORRENCIA_WEB OCW WHERE OCW.ID = NEW.OCORRENCIA_WEB_ID), 0),
				new.id
             );
       end

    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbautorizacao_a01iu for tbautorizacao
active after insert or update position 0
AS
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE VALOR VARCHAR(500);
DECLARE VARIABLE AUTORIZADORES VARCHAR(5000);
DECLARE VARIABLE DATA_BASE DATE;
DECLARE VARIABLE ASSUNTO VARCHAR(50);
DECLARE VARIABLE ASSUNTO_EMAIL VARCHAR(300);
DECLARE VARIABLE CORPO BLOB SUB_TYPE 0 SEGMENT SIZE 80;
DECLARE VARIABLE AUT_USUARIO_ID INTEGER;
DECLARE VARIABLE AUT_EMAIL VARCHAR(50);
DECLARE VARIABLE AUT_URL_SERVER VARCHAR(500);
DECLARE VARIABLE AUT_QTD_ITENS INTEGER;
DECLARE VARIABLE AUT_MIN_DATA VARCHAR(50);
DECLARE VARIABLE AUT_MAX_DATA VARCHAR(50);
BEGIN

    :DATA_BASE = COALESCE((SELECT IIF(MIN(Y.DATAHORA_ENTRADA) IS NOT NULL, MIN(Y.DATAHORA_ENTRADA), MAX(Y.DATAHORA_SAIDA)) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = NEW.ID), NULL);

    IF (INSERTING) THEN
    BEGIN

        IF (EXTRACT(WEEKDAY FROM :DATA_BASE) = 0 OR EXTRACT(WEEKDAY FROM :DATA_BASE) = 6) THEN
        BEGIN
    
            FOR
                SELECT
                    T.TABELA_ID AS USUARIO_ID,
                    COALESCE(T.VALOR, '') AS VALOR
                
                FROM TBPARAMETRO_DETALHE T
                INNER JOIN TBPARAMETRO A ON A.ID = T.PARAMETRO_ID
                WHERE A.CODIGO = 'AUTORIZADORES_NIVEL'
                
                ORDER BY T.VALOR
        
            INTO
                :USUARIO_ID,
                :VALOR
        
            DO
            BEGIN
        
                IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                BEGIN
        
                    UPDATE OR INSERT INTO TBAUTORIZACAO_AUTORIZADOR (AUTORIZACAO_ID, USUARIO_ID, NIVEL)
                        VALUES (NEW.ID, :USUARIO_ID, :VALOR)
                        MATCHING (AUTORIZACAO_ID, USUARIO_ID);
        
                END
        
            END
        
        
            :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');
        
            IF (COALESCE(:AUTORIZADORES, '') = '') THEN
            BEGIN
        
                UPDATE TBAUTORIZACAO
                    SET STATUS = 1,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;
        
            END ELSE
            BEGIN

                UPDATE TBAUTORIZACAO
                    SET STATUS = 0,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;

            END

        END ELSE
        BEGIN

            FOR
                SELECT
                    T.TABELA_ID AS USUARIO_ID,
                    COALESCE(T.VALOR, '') AS VALOR
                
                FROM TBPARAMETRO_DETALHE T
                INNER JOIN TBPARAMETRO A ON A.ID = T.PARAMETRO_ID
                WHERE A.CODIGO = 'AUTORIZADORES_NIVEL_DIAS_UTEIS'
                
                ORDER BY T.VALOR
        
            INTO
                :USUARIO_ID,
                :VALOR
        
            DO
            BEGIN
        
                IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                BEGIN
        
                    UPDATE OR INSERT INTO TBAUTORIZACAO_AUTORIZADOR (AUTORIZACAO_ID, USUARIO_ID, NIVEL)
                        VALUES (NEW.ID, :USUARIO_ID, :VALOR)
                        MATCHING (AUTORIZACAO_ID, USUARIO_ID);
        
                END
        
            END
        
        
            :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');
        
            IF (COALESCE(:AUTORIZADORES, '') = '') THEN
            BEGIN
        
                UPDATE TBAUTORIZACAO
                    SET STATUS = 1,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;
        
            END ELSE
            BEGIN

                UPDATE TBAUTORIZACAO
                    SET STATUS = 0,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;

            END    

        END

    END ELSE
    IF (UPDATING) THEN
    BEGIN

        IF (OLD.DATABASE_INFO IS DISTINCT FROM :DATA_BASE) THEN
        BEGIN

            DELETE FROM TBAUTORIZACAO_AUTORIZADOR WHERE AUTORIZACAO_ID = NEW.ID;

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

            IF (EXTRACT(WEEKDAY FROM :DATA_BASE) = 0 OR EXTRACT(WEEKDAY FROM :DATA_BASE) = 6) THEN
            BEGIN
        
                FOR
                    SELECT
                        T.TABELA_ID AS USUARIO_ID,
                        COALESCE(T.VALOR, '') AS VALOR
                    
                    FROM TBPARAMETRO_DETALHE T
                    INNER JOIN TBPARAMETRO A ON A.ID = T.PARAMETRO_ID
                    WHERE A.CODIGO = 'AUTORIZADORES_NIVEL'
                    
                    ORDER BY T.VALOR
            
                INTO
                    :USUARIO_ID,
                    :VALOR
            
                DO
                BEGIN
            
                    IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                    BEGIN
            
                        UPDATE OR INSERT INTO TBAUTORIZACAO_AUTORIZADOR (AUTORIZACAO_ID, USUARIO_ID, NIVEL)
                            VALUES (NEW.ID, :USUARIO_ID, :VALOR)
                            MATCHING (AUTORIZACAO_ID, USUARIO_ID);
            
                    END
            
                END
            
            
                :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');

                IF (COALESCE(:AUTORIZADORES, '') = '') THEN
                BEGIN

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 1,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;
            
                END ELSE
                BEGIN

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 0,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;

                END
    
            END ELSE
            BEGIN
    
                FOR
                    SELECT
                        T.TABELA_ID AS USUARIO_ID,
                        COALESCE(T.VALOR, '') AS VALOR
                    
                    FROM TBPARAMETRO_DETALHE T
                    INNER JOIN TBPARAMETRO A ON A.ID = T.PARAMETRO_ID
                    WHERE A.CODIGO = 'AUTORIZADORES_NIVEL_DIAS_UTEIS'
                    
                    ORDER BY T.VALOR
            
                INTO
                    :USUARIO_ID,
                    :VALOR
            
                DO
                BEGIN
            
                    IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                    BEGIN
            
                        UPDATE OR INSERT INTO TBAUTORIZACAO_AUTORIZADOR (AUTORIZACAO_ID, USUARIO_ID, NIVEL)
                            VALUES (NEW.ID, :USUARIO_ID, :VALOR)
                            MATCHING (AUTORIZACAO_ID, USUARIO_ID);
            
                    END
            
                END
            
            
                :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');
            
                IF (COALESCE(:AUTORIZADORES, '') = '') THEN
                BEGIN

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 1,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;
            
                END ELSE
                BEGIN

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 0,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;

                END
    
            END

            /******************************************************************/
            /* Envio de Notifica????o */

            :ASSUNTO        = '';   
            :ASSUNTO_EMAIL  = '';
            :CORPO          = '';


            FOR
                SELECT
                    U.CODIGO AS ID,
                    U.EMAIL,

                    FN_PARAMETRO_V2('SISTEMA.URL_SERVER') AS URL_SERVER,
                    COALESCE((SELECT COUNT(Y.ID) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = A.AUTORIZACAO_ID), 0) QTD_ITENS,
    
                    FORMATDATETIME( COALESCE((SELECT MIN(Y.DATAHORA_ENTRADA) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = A.AUTORIZACAO_ID), NULL) ) AS MIN_DATA,
                    FORMATDATETIME( COALESCE((SELECT MAX(Y.DATAHORA_SAIDA) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = A.AUTORIZACAO_ID), NULL) ) AS MAX_DATA
    
                FROM (
                    SELECT
                        A.AUTORIZACAO_ID,
                        MAX(A.NIVEL) AS MAX_NIVEL
                    FROM TBAUTORIZACAO_AUTORIZADOR A
                    WHERE A.STATUS = 0
                    AND A.AUTORIZACAO_ID = NEW.ID

                    GROUP BY A.AUTORIZACAO_ID
                ) X, TBAUTORIZACAO_AUTORIZADOR A, TBUSUARIO U
                WHERE X.MAX_NIVEL = A.NIVEL
                AND A.USUARIO_ID = U.CODIGO
                AND A.AUTORIZACAO_ID = X.AUTORIZACAO_ID

            INTO
                :AUT_USUARIO_ID,
                :AUT_EMAIL,
                :AUT_URL_SERVER,
                :AUT_QTD_ITENS,
                :AUT_MIN_DATA,
                :AUT_MAX_DATA

            DO
            BEGIN

                :ASSUNTO = 'Nova Autorizacao de Entrada';
                :ASSUNTO_EMAIL = 'Nova Autorizacao de Entrada, Estabelecimento: '|| COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(ESTAB.NOMEFANTASIA) > 0, ESTAB.NOMEFANTASIA, ESTAB.RAZAOSOCIAL) FROM TBESTABELECIMENTO ESTAB WHERE ESTAB.CODIGO = NEW.ESTABELECIMENTO_ID), '') ||', C.Custo: '|| COALESCE((SELECT FIRST 1 FN_MASK_V2(CCUSTO.CODIGO, 'CC')||' - '||CCUSTO.DESCRICAO FROM TBCENTRO_DE_CUSTO CCUSTO WHERE CCUSTO.CODIGO = NEW.CCUSTO_CODIGO), '') ||', Gestor: '|| COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(USU.NOME) > 0, USU.NOME, USU.USUARIO) FROM TBUSUARIO USU WHERE USU.CODIGO = NEW.GESTOR_ID), '');

                :CORPO = blob_append('','<div style="display: -webkit-inline-box;">');
                :CORPO = blob_append(:CORPO,' <span style="font-weight: bold;">O Gestor: </span>', COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(USU.NOME) > 0, USU.NOME, USU.USUARIO) FROM TBUSUARIO USU WHERE USU.CODIGO = NEW.GESTOR_ID), '') ,' <span style="font-weight: bold;">Solicita: </span> AUTORIZACAO DE ENTRADA/SAIDA DE COLABORADORES/PRESTADORES<br>');
                :CORPO = blob_append(:CORPO,' <span style="font-weight: bold;">Estabelecimento: </span>', COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(ESTAB.NOMEFANTASIA) > 0, ESTAB.NOMEFANTASIA, ESTAB.RAZAOSOCIAL) FROM TBESTABELECIMENTO ESTAB WHERE ESTAB.CODIGO = NEW.ESTABELECIMENTO_ID), '') ,'<br>');
                :CORPO = blob_append(:CORPO,' <span style="font-weight: bold;">C.Custo: </span>', COALESCE((SELECT FIRST 1 FN_MASK_V2(CCUSTO.CODIGO, 'CC')||' - '||CCUSTO.DESCRICAO FROM TBCENTRO_DE_CUSTO CCUSTO WHERE CCUSTO.CODIGO = NEW.CCUSTO_CODIGO), '') ,'<br>');
                :CORPO = blob_append(:CORPO,' <span style="font-weight: bold;">Per??odo: </span>', COALESCE(:AUT_MIN_DATA, '') ,' a ', COALESCE(:AUT_MAX_DATA, '') ,'<br>');
                :CORPO = blob_append(:CORPO,' <span style="font-weight: bold;">Qtd.: </span>', :AUT_QTD_ITENS ,'<br>');
                :CORPO = blob_append(:CORPO,'<br><a class="msg-balao-fechar" href="', :AUT_URL_SERVER ,'/_23411?ID=', NEW.ID ,'" target="_blank" >Clique aqui para ver</a>');
                :CORPO = blob_append(:CORPO,'</div>');


                INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                    VALUES (1, :AUT_USUARIO_ID, 0, 0, :ASSUNTO, 0, 0, CURRENT_TIMESTAMP, FN_CURRENT_USER_ID(), CURRENT_TIMESTAMP, 0, '', 0, :CORPO);

                INSERT INTO TBEMAIL (ID, EMAIL, USUARIO_ID, ASSUNTO, CORPO, STATUS, DATAHORA, MODULO_EMAIL)
                    VALUES (GEN_ID(GTBEMAIL, 1), :AUT_EMAIL, 0, :ASSUNTO_EMAIL, :CORPO, 0, CURRENT_TIMESTAMP, 1);

            END

        END

    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbautorizacao_autorizador_b03u for tbautorizacao_autorizador
active before update position 2
AS
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE NIVEL INTEGER;
DECLARE VARIABLE EMAIL_ID INTEGER;
DECLARE VARIABLE DESTINATARIO VARCHAR(500);
DECLARE VARIABLE ASSUNTO VARCHAR(500);
DECLARE VARIABLE ASSUNTO_EMAIL VARCHAR(500);
DECLARE VARIABLE CORPO BLOB SUB_TYPE 1 SEGMENT SIZE 80;

DECLARE VARIABLE MAX_NIVEL INTEGER;
DECLARE VARIABLE PENDENTES INTEGER;
DECLARE VARIABLE REPROVACOES INTEGER;
DECLARE VARIABLE LISTA VARCHAR(300);

DECLARE VARIABLE ESTABELECIMENTO VARCHAR(500);
DECLARE VARIABLE CCUSTO VARCHAR(500);
DECLARE VARIABLE GESTOR VARCHAR(500);
DECLARE VARIABLE DATAHORA_REGISTRO TIMESTAMP;
DECLARE VARIABLE STATUS INTEGER;
DECLARE VARIABLE QTD INTEGER;
DECLARE VARIABLE DT_ENTRADA TIMESTAMP;
DECLARE VARIABLE DT_SAIDA TIMESTAMP;
BEGIN

    SELECT
        MAX(A.NIVEL) AS MAX_NIVEL
    FROM TBAUTORIZACAO_AUTORIZADOR A
    WHERE A.STATUS = 0
    AND A.NIVEL < NEW.NIVEL
    AND A.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
        INTO :MAX_NIVEL;

    :MAX_NIVEL = COALESCE(:MAX_NIVEL, -1);

    SELECT
        COUNT(R.ID) AS PENDENTES,
        LIST(IIF(CHAR_LENGTH(U.NOME) > 0, U.NOME, U.USUARIO), ', ') AS LISTA
    FROM TBAUTORIZACAO_AUTORIZADOR R, TBUSUARIO U
    WHERE R.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
    AND R.ID <> NEW.ID
    AND R.STATUS = 0
    AND R.NIVEL  = NEW.NIVEL
    AND U.CODIGO = R.USUARIO_ID
        INTO :PENDENTES, :LISTA;

    :PENDENTES = COALESCE(:PENDENTES, 0);

    SELECT
        COUNT(R.ID) AS PENDENTES
    FROM TBAUTORIZACAO_AUTORIZADOR R
    WHERE R.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
    AND R.STATUS = 2
        INTO :REPROVACOES;

    :REPROVACOES = COALESCE(:REPROVACOES, 0);

    IF (:MAX_NIVEL >= 0 AND :PENDENTES = 0 AND NEW.STATUS <> 2 AND :REPROVACOES = 0) THEN
    BEGIN

        SELECT FIRST 1
            IIF(CHAR_LENGTH(B.NOMEFANTASIA) > 0, B.NOMEFANTASIA, B.RAZAOSOCIAL) AS ESTABELECIMENTO,
            FN_MASK_V2(C.CODIGO, 'CC')||' - '||C.DESCRICAO AS CCUSTO,
            IIF(CHAR_LENGTH(D.NOME) > 0, D.NOME, D.USUARIO) AS GESTOR,
            A.DATAHORA_REGISTRO,
            A.STATUS,

            COALESCE((SELECT COUNT(AD.ID) FROM TBAUTORIZACAO_DETALHE AD WHERE AD.AUTORIZACAO_ID = A.ID), 0) AS QTD,
            COALESCE((SELECT MIN(AD.DATAHORA_ENTRADA) FROM TBAUTORIZACAO_DETALHE AD WHERE AD.AUTORIZACAO_ID = A.ID), NULL) AS MIN_DT_ENTRADA,
            COALESCE((SELECT MAX(AD.DATAHORA_SAIDA) FROM TBAUTORIZACAO_DETALHE AD WHERE AD.AUTORIZACAO_ID = A.ID), NULL) AS MAX_DT_SAIDA

        FROM TBAUTORIZACAO A
        INNER JOIN TBESTABELECIMENTO B ON B.CODIGO = A.ESTABELECIMENTO_ID
        LEFT JOIN TBCENTRO_DE_CUSTO C ON C.CODIGO = A.CCUSTO_CODIGO
        LEFT JOIN TBUSUARIO D ON D.CODIGO = A.GESTOR_ID
        WHERE A.ID = NEW.AUTORIZACAO_ID
            INTO :ESTABELECIMENTO, :CCUSTO, :GESTOR, :DATAHORA_REGISTRO, :STATUS, :QTD, :DT_ENTRADA, :DT_SAIDA;

        :ESTABELECIMENTO        = FN_CAMEL_CASE(COALESCE(:ESTABELECIMENTO, ''));
        :CCUSTO                 = FN_CAMEL_CASE(COALESCE(:CCUSTO, ''));
        :GESTOR                 = FN_CAMEL_CASE(COALESCE(:GESTOR, ''));
        :DATAHORA_REGISTRO      = COALESCE(:DATAHORA_REGISTRO, NULL);
        :STATUS                 = COALESCE(:STATUS, 0);
        :QTD                    = COALESCE(:QTD, 0);
        :DT_ENTRADA             = COALESCE(:DT_ENTRADA, NULL);
        :DT_SAIDA               = COALESCE(:DT_SAIDA, NULL);

        ASSUNTO = 'Nova Autorizacao de Entrada';
        ASSUNTO_EMAIL = 'Nova Autorizacao de Entrada, Estabelecimento:'||:ESTABELECIMENTO||', C.Custo:'||:CCUSTO||', Gestor:'||:GESTOR;
    
        CORPO = blob_append('','<div style="display: -webkit-inline-box;">');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">O Gestor: </span>',:GESTOR,' <span style="font-weight: bold;">Solicita: </span> AUTORIZACAO DE ENTRADA/SAIDA DE COLABORADORES/PRESTADORES<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Estabelecimento: </span>',:ESTABELECIMENTO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">C.Custo: </span>',:CCUSTO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Per??odo: </span>',FORMATDATETIME(:DT_ENTRADA),' a ',FORMATDATETIME(:DT_SAIDA),'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Qtd.: </span>',:QTD,'<br>');
        CORPO = blob_append(CORPO,'<br><a class="msg-balao-fechar" href="',fn_parametro('SISTEMA.URL_SERVER'),'/_23411?ID=',NEW.AUTORIZACAO_ID,'" target="_blank" >Clique aqui para ver</a>');
        CORPO = blob_append(CORPO,'</div>');

        FOR
            SELECT
                A.USUARIO_ID,
                A.NIVEL
            FROM TBAUTORIZACAO_AUTORIZADOR A
            WHERE A.STATUS = 0
            AND A.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
            AND A.NIVEL = :MAX_NIVEL
        INTO
            :USUARIO_ID,
            :NIVEL
        DO
        BEGIN

            :EMAIL_ID = (SELECT GEN_ID(GTBEMAIL, 1) FROM RDB$DATABASE);
            :DESTINATARIO = COALESCE((SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID), '');

            IF (:MAX_NIVEL = :NIVEL) THEN
            BEGIN
    
                INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                    VALUES (1, :USUARIO_ID, 0, 0, :ASSUNTO, 0, 0, CURRENT_TIMESTAMP, FN_CURRENT_USER_ID(), CURRENT_TIMESTAMP, 0, '', 0, :CORPO);
    
                INSERT INTO TBEMAIL (ID, EMAIL, USUARIO_ID, ASSUNTO, CORPO, STATUS, DATAHORA, MODULO_EMAIL)
                    VALUES (:EMAIL_ID, :DESTINATARIO, 0, :ASSUNTO_EMAIL, :CORPO, 0, CURRENT_TIMESTAMP, 1);

            END

        END

    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcaso_feed_b02i for tbcaso_feed
active before insert position 0
AS
  declare variable corpo1 varchar(8000);
  declare variable corpo2 varchar(8000);
  declare variable corpo3 varchar(8000);
  declare variable id integer;
  declare variable ARQUIVO_ID integer;
begin

  if(new.origem = 0)then
  begin

    if(new.de <> '' and new.para <> '' and new.assunto <> '' and new.mensagem <> '' and (new.tipo = 1 /*or new.tipo = 4*/) and new.usuario_id > 0 and new.subfeed = 0)then
    begin

        for
           select * from SPC_EMAIL_CASO(new.caso_id, new.painel_id, new.mensagem)
        into
          :corpo1,
          :corpo2,
          :corpo3
        do
        begin

        end
    
        id = Gen_ID(gtbemail,1);

        insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, caso_feed_id, MODULO_EMAIL)
           values (
            :id,
            0,
            new.para,
            new.assunto,
            blob_append(:corpo1 , :corpo2 , :corpo3),
            new.usuario_id,
            new.em_copia,
            new.em_copia_oculta,
            new.painel_id,
            current_timestamp,
            (SELECT FIRST 1 CP.EMAIL FROM TBCASO_PAINEL CP WHERE CP.ID = NEW.PAINEL_ID),
            new.id,
            0
         );

         if(char_length(new.lista_file) > 0)then
         begin
           for
             select OSPLIT from split_blob(new.lista_file,',')
           into
             :ARQUIVO_ID
           do begin
              INSERT INTO TBEMAIL_ANEXO (EMAIL_ID, ARQUIVO_ID, DESCRICAO) VALUES (:id, :ARQUIVO_ID, '');
           end
         end

    end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbccusto_cota_b0u_01 for tbccusto_cota
active before update position 0
As
/*********************************************
           Verifica se bloqueia
           lan??amentos na cota            
*********************************************/
Declare variable vEmail  varchar(200);
Declare variable vCCusto varchar(200);
Declare variable vConta  varchar(200);
Declare variable Corpo_Email BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable Tolerancia numeric(15,2);
Begin

    Tolerancia = 1.00;

    If (Old.Utilizado + Old.Outros < New.Utilizado + New.Outros) Then
        begin
            vConta = Coalesce((Select First 1 C.Descricao  from TbContaContabil C Where C.Conta = New.ContaContabil),'');
            vCCusto= Coalesce((Select First 1 CC.Descricao from TbCentro_De_Custo CC Where CC.Codigo = New.CCusto),'');

            If (
                 (New.Notificacao = '1') and
                 (New.StatusExclusao = '0') and
                 (Round(:Tolerancia + New.Valor + New.Extra - New.Outros - New.Utilizado,2) < 0)  and
                 (Round(:Tolerancia + New.Valor + New.Extra - New.Outros - New.Utilizado,2) < Round(Old.Valor + Old.Extra - Old.Outros - Old.Utilizado,2))
               ) Then
            Begin
               -- Enviar Email --
                vEmail = Coalesce((Select First 1 CC.Email     from TbCentro_De_Custo CC Where CC.Codigo = New.CCusto),'');
                CORPO_EMAIL = blob_append(' MES/ANO:  ',NEW.MES,'/',NEW.ANO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                              ' CONTA:  ',FN_CCONTABIL_MASK(NEW.CONTACONTABIL),' - ',(SELECT PS_TEXTO FROM SP_REMOVE_ACENTO (:vConta)),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                              ' C.CUSTO:  ',FN_CCUSTO_MASK(NEW.CCUSTO),' - ',(SELECT PS_TEXTO FROM SP_REMOVE_ACENTO (:vCCusto)),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                              ' VR.DISPONIVEL:  R$ ',Cast(Old.Saldo AS NUMERIC(15,2)),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                              ' VR.DIFERENCA: R$ ',Cast(New.Utilizado-Old.Utilizado-Old.Saldo AS NUMERIC(15,2)),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                              '',ASCII_CHAR(13),ASCII_CHAR(10),COALESCE(NEW.OBSERVACAO,''));
        
                --CORPO_EMAIL = (SELECT PS_TEXTO FROM SP_REMOVE_ACENTO (:CORPO_EMAIL));
        
                if (vEmail <> '' and New.Bloqueio = '1') then
                    Begin
                --  Exception "..." '1'||:CORPO_EMAIL;
                    IN AUTONOMOUS TRANSACTION DO
                       Begin
                        Insert Into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
                        Values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :vEmail, 0, 'GCWeb! CONTROLE ORCAMENTARIO - SALDO INDISPONIVEL', :CORPO_EMAIL, 0, Current_TimeStamp, 13);
                       End
                    End else
                if (vEmail <> '' and New.Bloqueio = '0') then
                    Begin
                --  Exception "..." '2'||:CORPO_EMAIL;
                    Insert Into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
                    Values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :vEmail, 0, 'GCWeb! CONTROLE ORCAMENTARIO - SALDO EXCEDIDO', :CORPO_EMAIL, 0, Current_TimeStamp, 13);
                    End
        
            End

            -- exception "..." 'Novo'||New.Valor||'+'||New.Extra||'-'||New.Outros||'-'||New.Utilizado||' Anterior: '||Old.Valor||'+'||Old.Extra||'-'||Old.Outros||'-'||Old.Utilizado;

            If (
                 (New.Bloqueio = '1') and
                 (New.StatusExclusao = '0') and
                 (Round(:Tolerancia +New.Valor + New.Extra - New.Outros - New.Utilizado,2) < 0) and
                 (Round(:Tolerancia +New.Valor + New.Extra - New.Outros - New.Utilizado,2) < Round(Old.Valor + Old.Extra - Old.Outros - Old.Utilizado,2))
               ) Then       --  100                                 110 = -10               100                                   120  = -20
            Begin
                Exception "..." 'SALDO INDISPONIVEL DA COTA DO CONTROLE ORCAMENTARIO.'||'<br>'||
                                ' CONTA: '||FN_CCONTABIL_MASK(NEW.CONTACONTABIL)||' - '||vCONTA||'<br>'||
                                ' C.CUSTO: '||FN_CCUSTO_MASK(NEW.CCUSTO)||' - '||vCCUSTO||'<br>'||
                                ' VR.DISPONIVEL: '||FN_FORMAT_NUMBER(Old.Saldo,2)||'<br>'||
                                ' VR.LANCAMENTO: '||FN_FORMAT_NUMBER(New.Utilizado - Old.Utilizado,2)||'<br>'||
                                ' VR.DIFERENCA: '||FN_FORMAT_NUMBER((New.Utilizado-Old.Utilizado)-Old.Saldo,2)
                                ;
            End
        
            NEW.OBSERVACAO = '';
        End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcheque_item_b1iud for tbcheque_item
active before insert or update or delete position 9
AS
DECLARE VARIABLE HISTORICO_ATUAL BLOB SUB_TYPE 1 SEGMENT SIZE 80;

DECLARE VARIABLE HISTORICO BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE TIPO_CHEQUE CHAR(1);
DECLARE VARIABLE ID_CHEQUE INTEGER;

DECLARE VARIABLE OLD_DOCUMENTO VARCHAR(500);
DECLARE VARIABLE NEW_DOCUMENTO VARCHAR(500);
BEGIN

    HISTORICO = blob_append(null, '');


    IF (INSERTING) THEN
    BEGIN

        HISTORICO_ATUAL = COALESCE((SELECT FIRST 1 D.HISTORICO_SIT FROM TBCHEQUE D WHERE D.ID = NEW.CHEQUE_ID), '');

        TIPO_CHEQUE = COALESCE((SELECT FIRST 1 D.TIPO FROM TBCHEQUE D WHERE D.ID = NEW.CHEQUE_ID), '');
        ID_CHEQUE = NEW.CHEQUE_ID;

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

        OLD_DOCUMENTO = '';
        NEW_DOCUMENTO = COALESCE(IIF(TIPO_CHEQUE = 'D', (SELECT FIRST 1 FN_LPAD(A.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(A.SERIE, 3, '0')||'-'||FN_LPAD(A.PARCELA, 3, '0') FROM TBNFS_PARCELAMENTO A WHERE A.CONTROLE = NEW.DOCUMENTO_ID), (SELECT FIRST 1 FN_LPAD(B.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(B.SERIE, 3, '0')||'-'||FN_LPAD(B.PARCELA, 3, '0') FROM TBNFE_PARCELAMENTO B WHERE B.CONTROLE = NEW.DOCUMENTO_ID)), '');

        
        HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': DOCUMENTO ADICIONADO! DOC.:', '<strong>', NEW_DOCUMENTO ,'</strong> | VALOR: <strong>R$ ', FN_FORMAT_NUMBER2(NEW.VALOR, 2) ,'</strong>');

    END ELSE
    IF (UPDATING) THEN
    BEGIN

        HISTORICO_ATUAL = COALESCE((SELECT FIRST 1 D.HISTORICO_SIT FROM TBCHEQUE D WHERE D.ID = OLD.CHEQUE_ID), '');

        TIPO_CHEQUE = COALESCE((SELECT FIRST 1 D.TIPO FROM TBCHEQUE D WHERE D.ID = OLD.CHEQUE_ID), '');
        ID_CHEQUE = OLD.CHEQUE_ID;

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

        OLD_DOCUMENTO = COALESCE(IIF(TIPO_CHEQUE = 'D', (SELECT FIRST 1 FN_LPAD(A.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(A.SERIE, 3, '0')||'-'||FN_LPAD(A.PARCELA, 3, '0') FROM TBNFS_PARCELAMENTO A WHERE A.CONTROLE = OLD.DOCUMENTO_ID), (SELECT FIRST 1 FN_LPAD(B.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(B.SERIE, 3, '0')||'-'||FN_LPAD(B.PARCELA, 3, '0') FROM TBNFE_PARCELAMENTO B WHERE B.CONTROLE = OLD.DOCUMENTO_ID)), '');
        NEW_DOCUMENTO = COALESCE(IIF(TIPO_CHEQUE = 'D', (SELECT FIRST 1 FN_LPAD(A.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(A.SERIE, 3, '0')||'-'||FN_LPAD(A.PARCELA, 3, '0') FROM TBNFS_PARCELAMENTO A WHERE A.CONTROLE = NEW.DOCUMENTO_ID), (SELECT FIRST 1 FN_LPAD(B.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(B.SERIE, 3, '0')||'-'||FN_LPAD(B.PARCELA, 3, '0') FROM TBNFE_PARCELAMENTO B WHERE B.CONTROLE = NEW.DOCUMENTO_ID)), '');


        IF (OLD.DOCUMENTO_ID IS DISTINCT FROM NEW.DOCUMENTO_ID) THEN
        BEGIN

            HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': DOCUMENTO ALTERADO! ',
    
                '<strong>', OLD_DOCUMENTO ,'</strong>'
    
            ,' PARA ',
    
                '<strong>', NEW_DOCUMENTO ,'</strong>'
    
            ,'', IIF( COALESCE(HISTORICO, '') <> '', '<br>'|| ASCII_CHAR(13) || ASCII_CHAR(10), '' ) ,'', COALESCE(HISTORICO, '') ,'');

        END

        IF (OLD.VALOR IS DISTINCT FROM NEW.VALOR) THEN
        BEGIN

            HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': DOC. ', NEW_DOCUMENTO,' VALOR ALTERADO! ',
    
                '<strong>R$ ', FN_FORMAT_NUMBER2(OLD.VALOR, 2) ,'</strong>'
    
            ,' PARA ',
    
                '<strong>R$ '|| FN_FORMAT_NUMBER2(NEW.VALOR, 2) ,'</strong>'
    
            ,'', IIF( COALESCE(HISTORICO, '') <> '', '<br>'|| ASCII_CHAR(13) || ASCII_CHAR(10), '' ) ,'', COALESCE(HISTORICO, '') ,'');

        END

    END ELSE
    IF (DELETING) THEN
    BEGIN

        HISTORICO_ATUAL = COALESCE((SELECT FIRST 1 D.HISTORICO_SIT FROM TBCHEQUE D WHERE D.ID = OLD.CHEQUE_ID), '');

        TIPO_CHEQUE = COALESCE((SELECT FIRST 1 D.TIPO FROM TBCHEQUE D WHERE D.ID = OLD.CHEQUE_ID), '');
        ID_CHEQUE = OLD.CHEQUE_ID;

        /**********************************************************************************************************/
        
        OLD_DOCUMENTO = COALESCE(IIF(TIPO_CHEQUE = 'D', (SELECT FIRST 1 FN_LPAD(A.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(A.SERIE, 3, '0')||'-'||FN_LPAD(A.PARCELA, 3, '0') FROM TBNFS_PARCELAMENTO A WHERE A.CONTROLE = OLD.DOCUMENTO_ID), (SELECT FIRST 1 FN_LPAD(B.NUMERO_NOTAFISCAL, 6, '0')||'/'||FN_LPAD(B.SERIE, 3, '0')||'-'||FN_LPAD(B.PARCELA, 3, '0') FROM TBNFE_PARCELAMENTO B WHERE B.CONTROLE = OLD.DOCUMENTO_ID)), '');
        NEW_DOCUMENTO = '';


        HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': DOCUMENTO REMOVIDO! DOC.:', '<strong>', OLD_DOCUMENTO ,'</strong> | VALOR: <strong>R$ ', FN_FORMAT_NUMBER2(OLD.VALOR, 2) ,'</strong>');

    END


    IF (HISTORICO <> '') THEN
    BEGIN

        HISTORICO = blob_append(HISTORICO ,'<br>', ASCII_CHAR(13) , ASCII_CHAR(10) ,'', COALESCE(HISTORICO_ATUAL, '') ,'');

--		  EXCEPTION "..." 'ITEM - HIST: '||COALESCE(HISTORICO, '');

        UPDATE TBCHEQUE T
            SET T.HISTORICO_SIT = :HISTORICO
            WHERE T.ID = :ID_CHEQUE;

    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b01iud for tbconferencia_item
active before insert or update or delete position 9
AS
DECLARE VARIABLE HISTORICO_ATUAL BLOB SUB_TYPE 1 SEGMENT SIZE 80;

DECLARE VARIABLE HISTORICO BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE ID_CONFERENCIA INTEGER;

DECLARE VARIABLE OLD_PRODUTO VARCHAR(500);
DECLARE VARIABLE NEW_PRODUTO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (INSERTING) THEN
    BEGIN

        HISTORICO_ATUAL = COALESCE((SELECT FIRST 1 C.HISTORICO_CONF FROM TBCONFERENCIA C WHERE C.ID = NEW.CONFERENCIA_ID), '');

        ID_CONFERENCIA = NEW.CONFERENCIA_ID;

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

        OLD_PRODUTO = '';
        NEW_PRODUTO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 7, '0')||' - '||A.DESCRICAO FROM TBPRODUTO A WHERE A.CODIGO = NEW.PRODUTO_ID), '');


        HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': ITEM ADICIONADO! PROD.:', '<strong>', NEW_PRODUTO ,'</strong> | QTD.CONF.: <strong>', FN_FORMAT_NUMBER2(NEW.QTD_CONFERIDA, 0) ,'</strong>');

    END ELSE
    IF (UPDATING) THEN
    BEGIN

        HISTORICO_ATUAL = COALESCE((SELECT FIRST 1 C.HISTORICO_CONF FROM TBCONFERENCIA C WHERE C.ID = OLD.CONFERENCIA_ID), '');

        ID_CONFERENCIA = OLD.CONFERENCIA_ID;

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

        OLD_PRODUTO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 7, '0')||' - '||A.DESCRICAO FROM TBPRODUTO A WHERE A.CODIGO = OLD.PRODUTO_ID), '');
        NEW_PRODUTO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 7, '0')||' - '||A.DESCRICAO FROM TBPRODUTO A WHERE A.CODIGO = NEW.PRODUTO_ID), '');


        IF (OLD.PRODUTO_ID IS DISTINCT FROM NEW.PRODUTO_ID) THEN
        BEGIN

            HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': PRODUTO ALTERADO! ',
    
                '<strong>', OLD_PRODUTO ,'</strong>'
    
            ,' PARA ',
    
                '<strong>', NEW_PRODUTO ,'</strong>'
    
            ,'', IIF( COALESCE(HISTORICO, '') <> '', ' <br>'|| ASCII_CHAR(13) || ASCII_CHAR(10), '' ) ,'', COALESCE(HISTORICO, '') ,'');

        END

        IF (OLD.QTD_CONFERIDA IS DISTINCT FROM NEW.QTD_CONFERIDA) THEN
        BEGIN

            HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': ITEM ', NEW_PRODUTO ,' QTD.CONFERIDA ALTERADA! ',
    
                '<strong>', FN_FORMAT_NUMBER2(OLD.QTD_CONFERIDA, 0) ,'</strong>'
    
            ,' PARA ',
    
                '<strong>', FN_FORMAT_NUMBER2(NEW.QTD_CONFERIDA, 0) ,'</strong>'
    
            ,'', IIF( COALESCE(HISTORICO, '') <> '', ' <br>'|| ASCII_CHAR(13) || ASCII_CHAR(10), '' ) ,'', COALESCE(HISTORICO, '') ,'');

        END

    END ELSE
    IF (DELETING) THEN
    BEGIN

        HISTORICO_ATUAL = COALESCE((SELECT FIRST 1 C.HISTORICO_CONF FROM TBCONFERENCIA C WHERE C.ID = OLD.CONFERENCIA_ID), '');

        ID_CONFERENCIA = OLD.CONFERENCIA_ID;

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

        OLD_PRODUTO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 7, '0')||' - '||A.DESCRICAO FROM TBPRODUTO A WHERE A.CODIGO = OLD.PRODUTO_ID), '');
        NEW_PRODUTO = '';

        HISTORICO = blob_append('[',FORMATDATETIME(CURRENT_TIMESTAMP),'] - ',CURRENT_USER,': ITEM REMOVIDO! PROD.:', '<strong>', OLD_PRODUTO ,'</strong> | QTD.CONF.: <strong>', FN_FORMAT_NUMBER2(OLD.QTD_CONFERIDA, 0) ,'</strong>');
    END


    IF (HISTORICO <> '') THEN
    BEGIN

        HISTORICO = blob_append(HISTORICO ,' <br>', ASCII_CHAR(13) , ASCII_CHAR(10) ,'', COALESCE(HISTORICO_ATUAL, '') ,'');

        UPDATE TBCONFERENCIA T
            SET T.HISTORICO_CONF = :HISTORICO
            WHERE T.ID = :ID_CONFERENCIA;

    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_detalhe_aloc_b03d for tbestoque_detalhe_alocacao
active before delete position 2
AS
DECLARE VARIABLE DADOS BLOB SUB_TYPE 1 SEGMENT SIZE 80;
BEGIN

   DADOS = blob_append('',
                '{"ESTABELECIMENTO_ID": "',IIF(OLD.ESTABELECIMENTO_ID IS NULL,'NULL',OLD.ESTABELECIMENTO_ID),'",',
                '"LOCALIZACAO_ID": "',IIF(OLD.LOCALIZACAO_ID IS NULL,'NULL',OLD.LOCALIZACAO_ID),'",',
                '"TABELA_ID": "',IIF(OLD.TABELA_ID IS NULL,'NULL',OLD.TABELA_ID)||'",',
                '"TAB_ITEM_ID": "',IIF(OLD.TAB_ITEM_ID IS NULL,'NULL',OLD.TAB_ITEM_ID),'",',
                '"ID": "',IIF(OLD.ID IS NULL,'NULL',OLD.ID),'",',
                '"PRODUTO_ID": "',IIF(OLD.PRODUTO_ID IS NULL,'NULL',OLD.PRODUTO_ID),'",',
                '"TAMANHO": "',IIF(OLD.TAMANHO IS NULL,'NULL',OLD.TAMANHO),'",',
                '"QUANTIDADE": "',IIF(OLD.QUANTIDADE IS NULL,'NULL',OLD.QUANTIDADE),'",',
                '"TIPO": "',IIF(OLD.TIPO IS NULL,'NULL',OLD.TIPO),'",',
                '"SALDO": "',IIF(OLD.SALDO IS NULL,'NULL',OLD.SALDO),'",',
                '"ALOCACAO_ID": "',IIF(OLD.ALOCACAO_ID IS NULL,'NULL',OLD.ALOCACAO_ID),'",',
                '"TAMANHO_ITEM": "',IIF(OLD.TAMANHO_ITEM IS NULL,'NULL',OLD.TAMANHO_ITEM),'",',
                '"DATAHORA": "',IIF(OLD.DATAHORA IS NULL,'NULL',OLD.DATAHORA),'",',
                '"ESTOQUE_DETALHE_ID": "'||IIF(OLD.ESTOQUE_DETALHE_ID IS NULL,'NULL',OLD.ESTOQUE_DETALHE_ID),'",',
                '"USUARIO":"',COALESCE((SELECT FIRST 1 UPPER(a.usuario) FROM TBUSUARIO A WHERE A.CODIGO = FN_CURRENT_USER_ID()),''),'"}'
            );

    EXECUTE PROCEDURE SPI_BACKUP('TBESTOQUE_DETALHE_ALOCACAO', OLD.ID, DADOS);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbferramentaria_b7u for tbferramentaria
active before update position 7
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
BEGIN
  if (New.Status <> Old.Status) then
      Begin

        vEMAIL = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 236),'');
        if (vEMAIL <> '') then
            Begin
            vCORPO_EMAIL = blob_append(' FERRAMENTA: ',NEW.ID,' - ',NEW.DESCRICAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' SERIE: ',NEW.SERIE,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' DATA/HORA EMISSAO: '||FORMATDATETIME(Current_TimeStamp),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' STATUS: ',IIF(NEW.STATUS='1','FERRAMENTA REATIVADA','FERRAMENTA INATIVADA'),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           IIF(NEW.STATUS='1','','MOTIVO: '||COALESCE(NEW.MOTIVO_INATIVACAO,''))
            );
    
            Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
            Values (:vEmail, 0, 'GC - ALTERACAO DE STATUS DE FERRAMENTA - '||NEW.SERIE, :vCORPO_EMAIL, 0, Current_TimeStamp, 1);
            End

      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbocorrencia_web_a01i for tbocorrencia_web
active after insert position 0
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable linha integer;
declare variable usuario_id integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable tipo_descricao varchar(300);
declare variable motivo_descricao varchar(300);
declare variable de varchar(300);
declare variable para varchar(3000);
declare variable em_copia varchar(3000);
declare variable em_copia_oculta varchar(3000);
declare variable usuario_abertura varchar(300);
declare variable existe_cliente_id_visita integer;
declare variable cliente_prospeccao_visita varchar(300);
declare variable visita_cliente_titulo varchar(300);
declare variable usuario_email varchar(100);
begin

    if(new.id > 0)then
    begin

        :para            = lower(coalesce((select list(u.email,', ') as email from tbocorrencia_web_usuarios g, tbusuario u where u.codigo = g.usuario_id and g.ocorrencia_web_id = new.id and coalesce(u.email,'') <> '' /*and g.usuario_id <> new.usuario_id*/),''));
        :em_copia        = '';
        :em_copia_oculta = '';

        if(char_length(coalesce(new.EMAIL_ABERTURA,'')) > 0)then
        begin
          :para = coalesce(new.EMAIL_ABERTURA,'');
        end

        html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
        html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);

        select
            e.tipo_id,
            e.assunto,
            e.descricao,
            fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
            s.campos_tabela_web,
            s.campos_sql_web,
            s.descricao_web,
            t.descricao,
            m.descricao,
            t.email,
            coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = e.usuario_id),'') as usuario_abertura
        from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
        where e.id = new.id
        and s.ocorrencia_web_tipo_id = e.tipo_id
        and t.id = e.tipo_id
        and m.id = e.motivo_id
        into
            :tipo,
            :assunto,
            :descricao,
            :json,
            :campos_tabela_web,
            :campos_sql_web,
            :descricao_web,
            :tipo_descricao,
            :motivo_descricao,
            :de,
            :usuario_abertura;

        corpo1 = '';
        corpo2 = '';
        corpo3 = '';
        
        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 ,'<p> Foi registrada uma nova ocorrencia e voce esta envolvido.</p>');
        corpo1 = blob_append(corpo1 , '<br><br>');
        corpo1 = blob_append(corpo1 , '<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_26110?TIPO=',:tipo,'&ID=',new.id,'" target="_blank">[ABRIR OCORRENCIA NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , html1);
        
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>Ocorrencia aberta por ',:usuario_abertura,':</u></p>');
        corpo2 = blob_append(corpo2,'<p><u>Assunto</u>: ',:assunto,'</p>');
        corpo2 = blob_append(corpo2,'<p><u>Descricao</u>: ',:descricao,'</p>');
        corpo2 = blob_append(corpo2,'<br>');
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>',:descricao_web,'</u></p>');

        for
          select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
        into
          :campo,
          :linha
        do begin
          corpo2 = corpo2||'<p><u>'|| FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ||'</u>: '||fn_json_v3(:json, :campo)||'</p>';
        end

        corpo3 = corpo3 || html2 || '</body></html>';

        id = Gen_ID(gtbemail,1);

        IF(NEW.TIPO_ID = 1) THEN
        BEGIN
            :EXISTE_CLIENTE_ID_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_ID FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), 0);
            :CLIENTE_PROSPECCAO_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_PROSPECCAO_NOME FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), '');

            IF(:EXISTE_CLIENTE_ID_VISITA > 0) THEN
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE((SELECT FIRST 1 C.RAZAOSOCIAL FROM TBCLIENTE C WHERE C.CODIGO = :EXISTE_CLIENTE_ID_VISITA), '');
            END ELSE
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE(:CLIENTE_PROSPECCAO_VISITA, '');
            END
        END

        for
            select usuario_id from
            SP_NOTIFICACAO_OCORRENCIA(
                :descricao_web||' '||:VISITA_CLIENTE_TITULO||' - Nova Ocorrencia aberta ('||new.id||')',
                'Uma nova ocorrencia foi aberta e voce esta envolvido.<br><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORRENCIA]</a></p>',                new.id,
                new.usuario_id
            )
        into
         :usuario_id
        do begin

       end

       :USUARIO_EMAIL = COALESCE((SELECT FIRST 1 TIP.EMAIL_RECEBIMENTO FROM TBOCORRENCIA_WEB_TIPO TIP WHERE TIP.ID = NEW.TIPO_ID), NULL);

       if(coalesce(:corpo1 || :corpo2 || :corpo3, '') <> '' and char_length(:para) > 0)then
       begin
        insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, modulo_email, OCORRENCIA_ID)
           values (
            :id,
            0,
            :para,
            :descricao_web ||' [OCORRENCIA:'||lpad(new.id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
            blob_append(:corpo1 , :corpo2 , :corpo3),
            0,
            :em_copia,
            :em_copia_oculta,
            0,
            current_timestamp,
            :USUARIO_EMAIL,
            1,
			new.tipo_id
         );
       end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbocorrencia_web_a01i for tbocorrencia_web
active after insert position 0
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable linha integer;
declare variable usuario_id integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable tipo_descricao varchar(300);
declare variable motivo_descricao varchar(300);
declare variable de varchar(300);
declare variable para varchar(3000);
declare variable em_copia varchar(3000);
declare variable em_copia_oculta varchar(3000);
declare variable usuario_abertura varchar(300);
declare variable existe_cliente_id_visita integer;
declare variable cliente_prospeccao_visita varchar(300);
declare variable visita_cliente_titulo varchar(300);
declare variable usuario_email varchar(100);
begin

    if(new.id > 0)then
    begin

        :para            = lower(coalesce((select list(u.email,', ') as email from tbocorrencia_web_usuarios g, tbusuario u where u.codigo = g.usuario_id and g.ocorrencia_web_id = new.id and coalesce(u.email,'') <> '' /*and g.usuario_id <> new.usuario_id*/),''));
        :em_copia        = '';
        :em_copia_oculta = '';

        if(char_length(coalesce(new.EMAIL_ABERTURA,'')) > 0)then
        begin
          :para = coalesce(new.EMAIL_ABERTURA,'');
        end

        html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
        html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);

        select
            e.tipo_id,
            e.assunto,
            e.descricao,
            fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
            s.campos_tabela_web,
            s.campos_sql_web,
            s.descricao_web,
            t.descricao,
            m.descricao,
            t.email,
            coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = e.usuario_id),'') as usuario_abertura
        from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
        where e.id = new.id
        and s.ocorrencia_web_tipo_id = e.tipo_id
        and t.id = e.tipo_id
        and m.id = e.motivo_id
        into
            :tipo,
            :assunto,
            :descricao,
            :json,
            :campos_tabela_web,
            :campos_sql_web,
            :descricao_web,
            :tipo_descricao,
            :motivo_descricao,
            :de,
            :usuario_abertura;

        corpo1 = '';
        corpo2 = '';
        corpo3 = '';
        
        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 ,'<p> Foi registrada uma nova ocorrencia e voce esta envolvido.</p>');
        corpo1 = blob_append(corpo1 , '<br><br>');
        corpo1 = blob_append(corpo1 , '<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_26110?TIPO=',:tipo,'&ID=',new.id,'" target="_blank">[ABRIR OCORRENCIA NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , html1);
        
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>Ocorrencia aberta por ',:usuario_abertura,':</u></p>');
        corpo2 = blob_append(corpo2,'<p><u>Assunto</u>: ',:assunto,'</p>');
        corpo2 = blob_append(corpo2,'<p><u>Descricao</u>: ',:descricao,'</p>');
        corpo2 = blob_append(corpo2,'<br>');
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>',:descricao_web,'</u></p>');

        for
          select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
        into
          :campo,
          :linha
        do begin
          corpo2 = corpo2||'<p><u>'|| FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ||'</u>: '||fn_json_v3(:json, :campo)||'</p>';
        end

        corpo3 = corpo3 || html2 || '</body></html>';

        id = Gen_ID(gtbemail,1);

        IF(NEW.TIPO_ID = 1) THEN
        BEGIN
            :EXISTE_CLIENTE_ID_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_ID FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), 0);
            :CLIENTE_PROSPECCAO_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_PROSPECCAO_NOME FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), '');

            IF(:EXISTE_CLIENTE_ID_VISITA > 0) THEN
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE((SELECT FIRST 1 C.RAZAOSOCIAL FROM TBCLIENTE C WHERE C.CODIGO = :EXISTE_CLIENTE_ID_VISITA), '');
            END ELSE
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE(:CLIENTE_PROSPECCAO_VISITA, '');
            END
        END

        for
            select usuario_id from
            SP_NOTIFICACAO_OCORRENCIA(
                :descricao_web||' '||:VISITA_CLIENTE_TITULO||' - Nova Ocorrencia aberta ('||new.id||')',
                'Uma nova ocorrencia foi aberta e voce esta envolvido.<br><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORRENCIA]</a></p>',                new.id,
                new.usuario_id
            )
        into
         :usuario_id
        do begin

       end

       :USUARIO_EMAIL = COALESCE((SELECT FIRST 1 TIP.EMAIL_RECEBIMENTO FROM TBOCORRENCIA_WEB_TIPO TIP WHERE TIP.ID = NEW.TIPO_ID), NULL);

       if(blob_append(:corpo1 , :corpo2 , :corpo3) <> '' and char_length(:para) > 0)then
       begin
        insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, modulo_email, OCORRENCIA_ID)
           values (
            :id,
            0,
            :para,
            :descricao_web ||' [OCORRENCIA:'||lpad(new.id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
            blob_append(:corpo1 , :corpo2 , :corpo3),
            0,
            :em_copia,
            :em_copia_oculta,
            0,
            current_timestamp,
            :USUARIO_EMAIL,
            1,
			new.tipo_id
         );
       end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbocorrencia_web_a01i for tbocorrencia_web
active after insert position 0
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable linha integer;
declare variable usuario_id integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable tipo_descricao varchar(300);
declare variable motivo_descricao varchar(300);
declare variable de varchar(300);
declare variable para varchar(3000);
declare variable em_copia varchar(3000);
declare variable em_copia_oculta varchar(3000);
declare variable usuario_abertura varchar(300);
declare variable existe_cliente_id_visita integer;
declare variable cliente_prospeccao_visita varchar(300);
declare variable visita_cliente_titulo varchar(300);
declare variable usuario_email varchar(100);
begin

    if(new.id > 0)then
    begin

        :para            = lower(coalesce((select list(u.email,', ') as email from tbocorrencia_web_usuarios g, tbusuario u where u.codigo = g.usuario_id and g.ocorrencia_web_id = new.id and coalesce(u.email,'') <> '' /*and g.usuario_id <> new.usuario_id*/),''));
        :em_copia        = '';
        :em_copia_oculta = '';

        if(char_length(coalesce(new.EMAIL_ABERTURA,'')) > 0)then
        begin
          :para = coalesce(new.EMAIL_ABERTURA,'');
        end

        html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
        html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);

        select
            e.tipo_id,
            e.assunto,
            e.descricao,
            fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
            s.campos_tabela_web,
            s.campos_sql_web,
            s.descricao_web,
            t.descricao,
            m.descricao,
            t.email,
            coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = e.usuario_id),'') as usuario_abertura
        from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
        where e.id = new.id
        and s.ocorrencia_web_tipo_id = e.tipo_id
        and t.id = e.tipo_id
        and m.id = e.motivo_id
        into
            :tipo,
            :assunto,
            :descricao,
            :json,
            :campos_tabela_web,
            :campos_sql_web,
            :descricao_web,
            :tipo_descricao,
            :motivo_descricao,
            :de,
            :usuario_abertura;

        corpo1 = '';
        corpo2 = '';
        corpo3 = '';
        
        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 ,'<p> Foi registrada uma nova ocorrencia e voce esta envolvido.</p>');
        corpo1 = blob_append(corpo1 , '<br><br>');
        corpo1 = blob_append(corpo1 , '<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_26110?TIPO=',:tipo,'&ID=',new.id,'" target="_blank">[ABRIR OCORRENCIA NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , html1);
        
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>Ocorrencia aberta por ',:usuario_abertura,':</u></p>');
        corpo2 = blob_append(corpo2,'<p><u>Assunto</u>: ',:assunto,'</p>');
        corpo2 = blob_append(corpo2,'<p><u>Descricao</u>: ',:descricao,'</p>');
        corpo2 = blob_append(corpo2,'<br>');
        corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>',:descricao_web,'</u></p>');

        for
          select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
        into
          :campo,
          :linha
        do begin
          corpo2 = corpo2||'<p><u>'|| FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ||'</u>: '||fn_json_v3(:json, :campo)||'</p>';
        end

        corpo3 = corpo3 || html2 || '</body></html>';

        id = Gen_ID(gtbemail,1);

        IF(NEW.TIPO_ID = 1) THEN
        BEGIN
            :EXISTE_CLIENTE_ID_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_ID FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), 0);
            :CLIENTE_PROSPECCAO_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_PROSPECCAO_NOME FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), '');

            IF(:EXISTE_CLIENTE_ID_VISITA > 0) THEN
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE((SELECT FIRST 1 C.RAZAOSOCIAL FROM TBCLIENTE C WHERE C.CODIGO = :EXISTE_CLIENTE_ID_VISITA), '');
            END ELSE
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE(:CLIENTE_PROSPECCAO_VISITA, '');
            END
        END

        for
            select usuario_id from
            SP_NOTIFICACAO_OCORRENCIA(
                :descricao_web||' '||:VISITA_CLIENTE_TITULO||' - Nova Ocorrencia aberta ('||new.id||')',
                'Uma nova ocorrencia foi aberta e voce esta envolvido.<br><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORRENCIA]</a></p>',                new.id,
                new.usuario_id
            )
        into
         :usuario_id
        do begin

       end

       :USUARIO_EMAIL = COALESCE((SELECT FIRST 1 TIP.EMAIL_RECEBIMENTO FROM TBOCORRENCIA_WEB_TIPO TIP WHERE TIP.ID = NEW.TIPO_ID), NULL);

       if(blob_append(:corpo1 , :corpo2 , :corpo3) <> '' and char_length(:para) > 0)then
       begin
        insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, modulo_email, OCORRENCIA_ID)
           values (
            :id,
            0,
            :para,
            :descricao_web ||' [OCORRENCIA:'||lpad(new.id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
            blob_append(:corpo1 , :corpo2 , :corpo3),
            0,
            :em_copia,
            :em_copia_oculta,
            0,
            current_timestamp,
            :USUARIO_EMAIL,
            1,
			new.tipo_id
         );
       end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbocorrencia_web_a01u for tbocorrencia_web
active after update position 0
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable tipo_status integer;
declare variable linha integer;
declare variable usuario_id integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable tipo_descricao varchar(300);
declare variable motivo_descricao varchar(300);
declare variable de varchar(300);
declare variable para varchar(3000);
declare variable em_copia varchar(3000);
declare variable em_copia_oculta varchar(3000);
declare variable existe_cliente_id_visita integer;
declare variable cliente_prospeccao_visita varchar(300);
declare variable visita_cliente_titulo varchar(300);
declare variable usuario_email varchar(100);
begin


    if(old.status_id <> new.status_id)then
    begin
        tipo_status = coalesce((select first 1 iif(t.inicio = 1, 1, iif(t.fim = 1, 2, iif(t.abertura = 1, 3, 0))) from tbocorrencia_web_status t where t.id =  new.status_id),0);

        if(tipo_status = 2)then
        begin

                :para            = lower(coalesce((select list(u.email,', ') as email from tbocorrencia_web_usuarios g, tbusuario u where u.codigo = g.usuario_id and g.ocorrencia_web_id = new.id and coalesce(u.email,'') <> ''),''));
                :em_copia        = '';
                :em_copia_oculta = '';
        
                html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
                html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);
        
                select
                    e.tipo_id,
                    e.assunto,
                    e.descricao,
                    fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
                    s.campos_tabela_web,
                    s.campos_sql_web,
                    s.descricao_web,
                    t.descricao,
                    m.descricao,
                    t.email
                from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
                where e.id = new.id
                and s.ocorrencia_web_tipo_id = e.tipo_id
                and t.id = e.tipo_id
                and m.id = e.motivo_id
                into
                    :tipo,
                    :assunto,
                    :descricao,
                    :json,
                    :campos_tabela_web,
                    :campos_sql_web,
                    :descricao_web,
                    :tipo_descricao,
                    :motivo_descricao,
                    :de;
        
                corpo1 = blob_append(null, '');
                corpo2 = blob_append(null, '');
                corpo3 = blob_append(null, '');
                
                corpo1 = blob_append(corpo1 ,'<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
                corpo1 = blob_append(corpo1 ,'<p> Ocorrencia foi fechada.</p>');
                corpo1 = blob_append(corpo1 , '<br><br>');
                corpo1 = blob_append(corpo1 , '<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_26110?TIPO=',:tipo,'&ID=',new.id,'" target="_blank">[ABRIR OCORRENCIA NA WEB]</a></p>');
                corpo1 = blob_append(corpo1 , '<br>');
                corpo1 = blob_append(corpo1 , html1);
                
                corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>Ocorrencia:</u></p>');
                corpo2 = blob_append(corpo2,'<p><u>Assunto</u>: ',:assunto,'</p>');
                corpo2 = blob_append(corpo2,'<p><u>Descricao</u>: ',:descricao,'</p>');
                corpo2 = blob_append(corpo2,'<br>');
                corpo2 = blob_append(corpo2,'<p style="font-weight: bold;"><u>',:descricao_web,'</u></p>');
        
                for
                  select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
                into
                  :campo,
                  :linha
                do begin
                  corpo2 = blob_append(corpo2,'<p><u>', FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ,'</u>: ',fn_json_v3(:json, :campo),'</p>');
                end
        
                corpo3 = blob_append(corpo3 , html2 , '</body></html>');
        
                id = Gen_ID(gtbemail,1);
        
                IF(NEW.TIPO_ID = 1) THEN
                BEGIN
                    :EXISTE_CLIENTE_ID_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_ID FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), 0);
                    :CLIENTE_PROSPECCAO_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_PROSPECCAO_NOME FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), '');
        
                    IF(:EXISTE_CLIENTE_ID_VISITA > 0) THEN
                    BEGIN
                        :VISITA_CLIENTE_TITULO = COALESCE((SELECT FIRST 1 C.RAZAOSOCIAL FROM TBCLIENTE C WHERE C.CODIGO = :EXISTE_CLIENTE_ID_VISITA), '');
                    END ELSE
                    BEGIN
                        :VISITA_CLIENTE_TITULO = COALESCE(:CLIENTE_PROSPECCAO_VISITA, '');
                    END
                END

                for
                    select usuario_id from
                    SP_NOTIFICACAO_OCORRENCIA(
                        :descricao_web||' '||:VISITA_CLIENTE_TITULO||' - Ocorrencia fechada ('||new.id||')',
                        'Uma ocorrencia foi fechada e voce estava envolvido.<br><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORRENCIA]</a></p>',
                        new.id,
                        new.usuario_id
                    )
                into
                 :usuario_id
                do begin

                end

                :USUARIO_EMAIL = COALESCE((SELECT FIRST 1 TIP.EMAIL_RECEBIMENTO FROM TBOCORRENCIA_WEB_TIPO TIP WHERE TIP.ID = NEW.TIPO_ID), NULL);

                insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, modulo_email, OCORRENCIA_ID)
                   values (
                    :id,
                    0,
                    :para,
                    :descricao_web ||' [OCORRENCIA:'||lpad(new.id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
                    blob_append(:corpo1 , :corpo2 , :corpo3),
                    0,
                    :em_copia,
                    :em_copia_oculta,
                    0,
                    current_timestamp,
                    :USUARIO_EMAIL,
                    1,
					new.tipo_id
                 );
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbparametro_b0iud for tbparametro
active before insert or update or delete position 0
AS
declare variable TABELA VARCHAR(50);
declare variable sql BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UTF8;
begin
    
    TABELA =
        CASE IIF(DELETING,OLD.TABELA,NEW.TABELA)
            WHEN 'SISTEMA'    THEN 'TBCONTROLE_N'
            WHEN 'TBOPERADOR' THEN 'TBCONTROLE_O'
            WHEN 'TBUSUARIO'  THEN 'TBCONTROLE_U' 
            WHEN 'TBMODELO'   THEN 'TBCONTROLE_M'
        END;

    IF ( TABELA IS NOT NULL AND COALESCE(FN_GET_CONTEXT_TEMPORARY('ALTER_TBPARAMETRO'),0) <>  2 ) THEN
    BEGIN
        FN_SET_CONTEXT('ALTER_TBPARAMETRO',1);

        IF ( DELETING ) THEN
        BEGIN
            EXECUTE STATEMENT 'DELETE FROM ' || TABELA || ' WHERE ID = ' || OLD.CONTROLE || ';';
        END
        ELSE
        BEGIN
            sql = blob_append('
            UPDATE OR INSERT INTO ' , TABELA , ' (
                ID,
                GRUPO,
                PARAMETRO,
                VALOR_EXT,
                COMENTARIO
            ) VALUES (
                '   , coalesce(NEW.CONTROLE,0)   , ',
                ''' , coalesce(NEW.GRUPO,'')     , ''',
                ''' , coalesce(NEW.DESCRICAO,'') , ''',
                ''' , coalesce(NEW.VALOR,'')     , ''',
                ''' , coalesce(NEW.OBSERVACAO,''), '''
            ) MATCHING ( ID ); ','');

            EXECUTE STATEMENT sql;
 
        END
    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_mfe_b02i for tbpdv_mfe
active before insert or update position 2
AS
DECLARE VARIABLE NAME_GENERATOR VARCHAR(100);
BEGIN
    IF(NEW.GENERATOR_MFE IS NULL) THEN
    BEGIN
        :NAME_GENERATOR = 'GTBSESSAO_MFE_'||FN_LPAD(NEW.ID, 4, '0');
        EXECUTE STATEMENT 'CREATE GENERATOR ' || :NAME_GENERATOR || '';
        NEW.GENERATOR_MFE = :NAME_GENERATOR;

    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_b11u for tbpedido
inactive before update position 13
AS
declare variable supervisor integer;
declare variable supervisores varchar(300);
declare variable REPROVADO integer;
declare variable primeiro_pedido varchar(10);
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable motivo blob sub_type 1 segment size 80;
declare variable usuario_id integer;
begin

  --se pedido gravado pelo representante
  if(new.autorizacao_supervisor = 1 and (old.autorizacao_supervisor = 0 or old.autorizacao_supervisor = 2))then
  begin

    supervisor = coalesce((select
                                r.supervisor_id
                            from TBREPRESENTANTE r where r.codigo = new.representante_codigo),0);

    if(supervisor > 0)then
    begin

        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 , '<p></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="',coalesce(fn_parametro('SISTEMA.URL_SERVER'),'/_12200?PEDIDO=',coalesce(new.pedido,0),''),'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>Pedido: ',coalesce(new.pedido,0),'</u></p>');
        corpo1 = blob_append(corpo1 , '<p><u>Digitado por</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',coalesce(new.observacao,''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Cliente</u>: ',coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '</body></html>');

        usuario_id = coalesce((select
                                s.usuario_id
                                from TBSUPERVISOR s where s.id = :supervisor),0);

        if(usuario_id > 0)then
        begin
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :usuario_id,
                'Pedido pendente de aprovação (SUPERVISOR)',
                :corpo1,
                1,
                1,
                5
            );
        end
    end

  end

  --se reprovado pelo supervisor
  if((old.autorizacao_supervisor = 1 or old.autorizacao_supervisor = 3) and new.autorizacao_supervisor = 2)then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Reprovado (Supervisor)');

    supervisor = coalesce((select
                                r.supervisor_id
                            from TBREPRESENTANTE r where r.codigo = new.representante_codigo),0);

    if(new.usuario_codigo > 0)then
    begin

        select first 1 s.motivo, S.usuario_id from TBPEDIDO_APROVACAO s where s.pedido_id = new.pedido and s.tipo = 1 order by ID desc
        INTO motivo, REPROVADO;

        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 , '<p></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="'||coalesce(fn_parametro('SISTEMA.URL_SERVER'),'/_12200?PEDIDO=',new.pedido,''),'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>Pedido: ',coalesce(new.pedido,0),'</u></p>');
        corpo1 = blob_append(corpo1 , '<p><u>Reprovador por</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = :REPROVADO),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Motivo:</u>: ',coalesce(:motivo,''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',new.observacao,'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Cliente</u>: ',coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '</body></html>');

        execute procedure SPI_NOTIFICAR(
            current_timestamp,
            new.usuario_codigo,
            'Pedido reprovado (SUPERVISOR)',
            :corpo1,
            1,
            1
        );
    end

  end

  --se aprovado pelo supervisor
  if(new.autorizacao_supervisor = 3 and new.autorizacao_financeiro = 1 and (old.autorizacao_supervisor = 1 or old.autorizacao_supervisor = 2))then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Aprovado (Supervisor)');

    supervisores = coalesce((select LIST(U.usuario_id,',') FROM tbcontrole_usuario U WHERE  U.id = 897 and u.valor_ext = '1'),'186');

    --se cliente tem um pedido já confirmado
    primeiro_pedido = coalesce((select first 1 p.pedido from tbpedido p where p.pedido <> new.pedido and p.cliente_codigo = new.cliente_codigo and p.situacao = 1),0);
    if(primeiro_pedido = 0)then
    begin
       primeiro_pedido = 'Sim';
    end else
    begin
       primeiro_pedido = 'Não';
    end

    if( char_length(coalesce(supervisores,'')) > 0)then
    begin

        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 , '<p></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="',coalesce(fn_parametro('SISTEMA.URL_SERVER'),'/_12200?PEDIDO=',new.pedido,''),'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="',coalesce(fn_parametro('SISTEMA.URL_SERVER'),'/_12090?EMPRESA_ID=',new.cliente_codigo,''),'" target="_blank">[ABRIR CLIENTE NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>Pedido: ',coalesce(new.pedido,0),'</u></p>');
        corpo1 = blob_append(corpo1 , '<p><u>Primeiro Pedido</u>: ',coalesce(primeiro_pedido,''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Digitado por</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',coalesce(new.observacao,0),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Cliente</u>: ',coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '</body></html>');

        FOR
            select OSPLIT FROM split2(:supervisores,',')
        INTO
            :supervisores
        do BEGIN
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :supervisores,
                'Pedido pendente de aprovação (FINANCEIRO)',
                :corpo1,
                1,
                1
            );
       END
    end

  end

  --se aprovado pelo supervisor automaticamente
  if(new.autorizacao_supervisor = 3 and new.autorizacao_financeiro = 1 and old.autorizacao_supervisor = 0 and old.autorizacao_financeiro = 0)then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Aprovado (Supervisor)');

    supervisores = coalesce((select LIST(U.usuario_id,',') FROM tbcontrole_usuario U WHERE  U.id = 897 and u.valor_ext = '1'),'186');

    --se cliente tem um pedido já confirmado
    primeiro_pedido = coalesce((select first 1 p.pedido from tbpedido p where p.pedido <> new.pedido and p.cliente_codigo = new.cliente_codigo and p.situacao = 1),0);
    if(primeiro_pedido = 0)then
    begin
       primeiro_pedido = 'Sim';
    end else
    begin
       primeiro_pedido = 'Não';
    end

    if( char_length(coalesce(supervisores,'')) > 0)then
    begin

        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 , '<p></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="',coalesce(fn_parametro('SISTEMA.URL_SERVER'),'/_12200?PEDIDO=',new.pedido,''),'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="',coalesce(fn_parametro('SISTEMA.URL_SERVER'),'/_12090?EMPRESA_ID=',new.cliente_codigo,''),'" target="_blank">[ABRIR CLIENTE NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>Pedido: ',coalesce(new.pedido,0),'</u></p>');
        corpo1 = blob_append(corpo1 , '<p><u>Primeiro Pedido</u>: ',coalesce(primeiro_pedido,''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Digitado por</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',coalesce(new.observacao,0),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Cliente</u>: ',coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '</body></html>');

        FOR
            select OSPLIT FROM split2(:supervisores,',')
        INTO
            :supervisores
        do BEGIN
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :supervisores,
                'Pedido pendente de aprovação (FINANCEIRO)',
                :corpo1,
                1,
                1
            );
       END
    end

  end

  --se reprovado pelo financeiro
  if(new.autorizacao_financeiro = 2 and (old.autorizacao_financeiro = 1 or old.autorizacao_financeiro = 3))then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Reprovado (Financeiro)');

    supervisor = coalesce((select
                                r.supervisor_id
                            from TBREPRESENTANTE r where r.codigo = new.representante_codigo),0);

    if(supervisor > 0)then
    begin

        select first 1 s.motivo, S.usuario_id from TBPEDIDO_APROVACAO s where s.pedido_id = new.pedido and s.tipo = 2 order by ID desc
        INTO motivo, REPROVADO;

        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 , '<p></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER'),'/_12200?PEDIDO=',new.pedido,'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>Pedido: ',new.pedido,'</u></p>');
        corpo1 = blob_append(corpo1 , '<p><u>Reprovador por</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = :REPROVADO),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Digitado por</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Motivo:</u>: ',:motivo,'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',new.observacao,'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Cliente</u>: ',coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '</body></html>');

        execute procedure SPI_NOTIFICAR(
            current_timestamp,
            new.usuario_codigo,
            'Pedido reprovado (FINANCEIRO)',
            :corpo1,
            1,
            1
        );
    end

  end

  --se aprovado
  if(new.autorizacao_supervisor = 3 and new.autorizacao_financeiro = 3 and (old.autorizacao_supervisor <> 3 or old.autorizacao_financeiro <> 3))then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Aprovado (Financeiro)');

    supervisores = coalesce((select LIST(U.usuario_id,',') FROM tbcontrole_usuario U WHERE  U.id = 898 and u.valor_ext = '1'),'186');

    if( char_length(coalesce(supervisores,'')) > 0)then
    begin

        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 , '<p></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_12200?PEDIDO=',new.pedido,'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>Pedido: ',new.pedido,'</u></p>');
        corpo1 = blob_append(corpo1 , '<p><u>Digitado por</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',new.observacao,'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Cliente</u>: ',coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),''),'</p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '</body></html>');

        FOR
            select OSPLIT FROM split2(:supervisores,',')
        INTO
            :supervisores
        do BEGIN
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :supervisores,
                'Novo Pedido Digitado',
                :corpo1,
                1,
                1
            );
       END
    end

  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_b12d for tbpedido
active before delete position 2
AS
DECLARE VARIABLE DADOS BLOB SUB_TYPE 1 SEGMENT SIZE 80;
BEGIN

   DADOS = blob_append(
            '{"ESTABELECIMENTO_CODIGO": "',IIF(OLD.ESTABELECIMENTO_CODIGO IS NULL, 'NULL',OLD.ESTABELECIMENTO_CODIGO),'",',
            '"PEDIDO": "',IIF(OLD.PEDIDO IS NULL, 'NULL',OLD.PEDIDO),'",',
            '"PEDIDO_CLIENTE": "',IIF(OLD.PEDIDO_CLIENTE IS NULL, 'NULL',OLD.PEDIDO_CLIENTE),'",',
            '"DATA": "',IIF(OLD.DATA IS NULL, 'NULL',OLD.DATA),'",',
            '"DATA_ENTREGA": "',IIF(OLD.DATA_ENTREGA IS NULL, 'NULL',OLD.DATA_ENTREGA),'",',
            '"REPRESENTANTE_CODIGO": "',IIF(OLD.REPRESENTANTE_CODIGO IS NULL, 'NULL',OLD.REPRESENTANTE_CODIGO),'",',
            '"CLIENTE_CODIGO": "',IIF(OLD.CLIENTE_CODIGO IS NULL, 'NULL',OLD.CLIENTE_CODIGO),'",',
            '"TRANSPORTADORA_CODIGO": "',IIF(OLD.TRANSPORTADORA_CODIGO IS NULL, 'NULL',OLD.TRANSPORTADORA_CODIGO),'",',
            '"FRETE": "',IIF(OLD.FRETE IS NULL, 'NULL',OLD.FRETE),'",',
            '"PAGAMENTO_FORMA": "',IIF(OLD.PAGAMENTO_FORMA IS NULL, 'NULL',OLD.PAGAMENTO_FORMA),'",',
            '"PAGAMENTO_CONDICAO": "',IIF(OLD.PAGAMENTO_CONDICAO IS NULL, 'NULL',OLD.PAGAMENTO_CONDICAO),'",',
            '"FAMILIA_CODIGO": "',IIF(OLD.FAMILIA_CODIGO IS NULL, 'NULL',OLD.FAMILIA_CODIGO),'",',
            '"OBSERVACAO": "',IIF(OLD.OBSERVACAO IS NULL, 'NULL',OLD.OBSERVACAO),'",',
            '"TIPO": "',IIF(OLD.TIPO IS NULL, 'NULL',OLD.TIPO),'",',
            '"STATUS": "',IIF(OLD.STATUS IS NULL, 'NULL',OLD.STATUS),'",',
            '"STATUSEXCLUSAO": "',IIF(OLD.STATUSEXCLUSAO IS NULL, 'NULL',OLD.STATUSEXCLUSAO),'",',
            '"USUARIO_CODIGO": "',IIF(OLD.USUARIO_CODIGO IS NULL, 'NULL',OLD.USUARIO_CODIGO),'",',
            '"USUARIO_DATA": "',IIF(OLD.USUARIO_DATA IS NULL, 'NULL',OLD.USUARIO_DATA),'",',
            '"SITUACAO": "',IIF(OLD.SITUACAO IS NULL, 'NULL',OLD.SITUACAO),'",',
            '"USUARIO_CODIGO_CONFIRMACAO": "',IIF(OLD.USUARIO_CODIGO_CONFIRMACAO IS NULL, 'NULL',OLD.USUARIO_CODIGO_CONFIRMACAO),'",',
            '"USUARIO_DATA_CONFIRMACAO": "',IIF(OLD.USUARIO_DATA_CONFIRMACAO IS NULL, 'NULL',OLD.USUARIO_DATA_CONFIRMACAO),'",',
            '"MOEDA": "',IIF(OLD.MOEDA IS NULL, 'NULL',OLD.MOEDA),'",',
            '"DATA_CLIENTE": "',IIF(OLD.DATA_CLIENTE IS NULL, 'NULL',OLD.DATA_CLIENTE),'",',
            '"DATA_SISTEMA": "',IIF(OLD.DATA_SISTEMA IS NULL, 'NULL',OLD.DATA_SISTEMA),'",',
            '"TABELA_PRECO_ID": "',IIF(OLD.TABELA_PRECO_ID IS NULL, 'NULL',OLD.TABELA_PRECO_ID),'",',
            '"VENDEDOR_ID": "',IIF(OLD.VENDEDOR_ID IS NULL, 'NULL',OLD.VENDEDOR_ID),'",',
            '"VENDEDOR_COMISSAO": "',IIF(OLD.VENDEDOR_COMISSAO IS NULL, 'NULL',OLD.VENDEDOR_COMISSAO),'",',
            '"REPRESENTANTE_COMISSAO": "',IIF(OLD.REPRESENTANTE_COMISSAO IS NULL, 'NULL',OLD.REPRESENTANTE_COMISSAO),'",',
            '"DESCONTO1": "',IIF(OLD.DESCONTO1 IS NULL, 'NULL',OLD.DESCONTO1),'",',
            '"DESCONTO2": "',IIF(OLD.DESCONTO2 IS NULL, 'NULL',OLD.DESCONTO2),'",',
            '"PERIODO1": "',IIF(OLD.PERIODO1 IS NULL, 'NULL',OLD.PERIODO1),'",',
            '"PERIODO2": "',IIF(OLD.PERIODO2 IS NULL, 'NULL',OLD.PERIODO2),'",',
            '"PRIORIDADE": "',IIF(OLD.PRIORIDADE IS NULL, 'NULL',OLD.PRIORIDADE),'",',
            '"ATENDE_GRADE_COMPLETA": "',IIF(OLD.ATENDE_GRADE_COMPLETA IS NULL, 'NULL',OLD.ATENDE_GRADE_COMPLETA),'",',
            '"VOLUME": "',IIF(OLD.VOLUME IS NULL, 'NULL',OLD.VOLUME),'",',
            '"VOLUMES": "',IIF(OLD.VOLUMES IS NULL, 'NULL',OLD.VOLUMES),'",',
            '"PESO_LIQUIDO": "',IIF(OLD.PESO_LIQUIDO IS NULL, 'NULL',OLD.PESO_LIQUIDO),'",',
            '"PESO_BRUTO": "',IIF(OLD.PESO_BRUTO IS NULL, 'NULL',OLD.PESO_BRUTO),'",',
            '"CONFERENTE": "',IIF(OLD.CONFERENTE IS NULL, 'NULL',OLD.CONFERENTE),'",',
            '"EMBALAGEM": "',IIF(OLD.EMBALAGEM IS NULL, 'NULL',OLD.EMBALAGEM),'",',
            '"TABELA_VARIACAO": "',IIF(OLD.TABELA_VARIACAO IS NULL, 'NULL',OLD.TABELA_VARIACAO),'",',
            '"BLOQUEIA_ATENDIMENTO": "',IIF(OLD.BLOQUEIA_ATENDIMENTO IS NULL, 'NULL',OLD.BLOQUEIA_ATENDIMENTO),'",',
            '"TIPO_PEDIDO": "',IIF(OLD.TIPO_PEDIDO IS NULL, 'NULL',OLD.TIPO_PEDIDO),'",');

    DADOS = blob_append(DADOS, '"PEDIDO_REP": "',IIF(OLD.PEDIDO_REP IS NULL, 'NULL',OLD.PEDIDO_REP),'",',
            '"DATA_SINC": "',IIF(OLD.DATA_SINC IS NULL, 'NULL',OLD.DATA_SINC),'",',
            '"SINC": "',IIF(OLD.SINC IS NULL, 'NULL',OLD.SINC),'",',
            '"GRUPO_ID": "',IIF(OLD.GRUPO_ID IS NULL, 'NULL',OLD.GRUPO_ID),'",',
            '"OBSERVACAO_DETALHADA": "',IIF(OLD.OBSERVACAO_DETALHADA IS NULL, 'NULL',OLD.OBSERVACAO_DETALHADA),'",',
            '"OCORRENCIAS": "',IIF(OLD.OCORRENCIAS IS NULL, 'NULL',OLD.OCORRENCIAS),'",',
            '"CLASSIFICACAO_FINANCEIRA": "',IIF(OLD.CLASSIFICACAO_FINANCEIRA IS NULL, 'NULL',OLD.CLASSIFICACAO_FINANCEIRA),'",',
            '"TABELA_UF": "',IIF(OLD.TABELA_UF IS NULL, 'NULL',OLD.TABELA_UF),'",',
            '"CCUSTO": "',IIF(OLD.CCUSTO IS NULL, 'NULL',OLD.CCUSTO),'",',
            '"PESO": "',IIF(OLD.PESO IS NULL, 'NULL',OLD.PESO),'",',
            '"VALOR_FRETE": "',IIF(OLD.VALOR_FRETE IS NULL, 'NULL',OLD.VALOR_FRETE),'",',
            '"CODIGO_RASTREIO": "',IIF(OLD.CODIGO_RASTREIO IS NULL, 'NULL',OLD.CODIGO_RASTREIO),'",',
            '"TRATAMENTO": "',IIF(OLD.TRATAMENTO IS NULL, 'NULL',OLD.TRATAMENTO),'",',
            '"PROGRAMADO": "',IIF(OLD.PROGRAMADO IS NULL, 'NULL',OLD.PROGRAMADO),'",',
            '"DATA_PRODUCAO": "',IIF(OLD.DATA_PRODUCAO IS NULL, 'NULL',OLD.DATA_PRODUCAO),'",',
            '"CLIENTE_ID_AMOSTRA": "',IIF(OLD.CLIENTE_ID_AMOSTRA IS NULL, 'NULL',OLD.CLIENTE_ID_AMOSTRA),'",',
            '"SALESFORCE": "',IIF(OLD.SALESFORCE IS NULL, 'NULL',OLD.SALESFORCE),'",',
            '"FORMA_ANALISE": "',IIF(OLD.FORMA_ANALISE IS NULL, 'NULL',OLD.FORMA_ANALISE),'",',
            '"CHAVE_LIBERACAO": "',IIF(OLD.CHAVE_LIBERACAO IS NULL, 'NULL',OLD.CHAVE_LIBERACAO),'",',
            '"REMESSA_ID": "',IIF(OLD.REMESSA_ID IS NULL, 'NULL',OLD.REMESSA_ID),'",',
            '"FLAG_DATA": "',IIF(OLD.FLAG_DATA IS NULL, 'NULL',OLD.FLAG_DATA),'",',
            '"FLAG_REPRESENTANTE": "',IIF(OLD.FLAG_REPRESENTANTE IS NULL, 'NULL',OLD.FLAG_REPRESENTANTE),'",',
            '"STATUS_ECOMMERCE": "',IIF(OLD.STATUS_ECOMMERCE IS NULL, 'NULL',OLD.STATUS_ECOMMERCE),'",',
            '"STATUS_PAGAMENTO": "',IIF(OLD.STATUS_PAGAMENTO IS NULL, 'NULL',OLD.STATUS_PAGAMENTO),'",',
            '"ECOMMERCE": "',IIF(OLD.ECOMMERCE IS NULL, 'NULL',OLD.ECOMMERCE),'",',
            '"CTE": "',IIF(OLD.CTE IS NULL, 'NULL',OLD.CTE),'",',
            '"GRADE_TIPO_ID": "',IIF(OLD.GRADE_TIPO_ID IS NULL, 'NULL',OLD.GRADE_TIPO_ID),'",',
            '"TIPO_FRETE": "',IIF(OLD.TIPO_FRETE IS NULL, 'NULL',OLD.TIPO_FRETE),'",',
            '"CLASSIFICACAO": "',IIF(OLD.CLASSIFICACAO IS NULL, 'NULL',OLD.CLASSIFICACAO),'",',
            '"AUTORIZACAO_SUPERVISOR": "',IIF(OLD.AUTORIZACAO_SUPERVISOR IS NULL, 'NULL',OLD.AUTORIZACAO_SUPERVISOR),'",',
            '"AUTORIZACAO_FINANCEIRO": "',IIF(OLD.AUTORIZACAO_FINANCEIRO IS NULL, 'NULL',OLD.AUTORIZACAO_FINANCEIRO),'",',
            '"CLIENTE_TIPO_ID": "',IIF(OLD.CLIENTE_TIPO_ID IS NULL, 'NULL',OLD.CLIENTE_TIPO_ID),'",',
            '"CLIENTE_SUB_TIPO_ID": "',IIF(OLD.CLIENTE_SUB_TIPO_ID IS NULL, 'NULL',OLD.CLIENTE_SUB_TIPO_ID),'",',
            '"ORIGEM_PRECO_ID": "',IIF(OLD.ORIGEM_PRECO_ID IS NULL, 'NULL',OLD.ORIGEM_PRECO_ID),'",',
            '"TAXA_MOEDA": "',IIF(OLD.TAXA_MOEDA IS NULL, 'NULL',OLD.TAXA_MOEDA),'",',
            '"PRECO_NF_CF_ID": "',IIF(OLD.PRECO_NF_CF_ID IS NULL, 'NULL',OLD.PRECO_NF_CF_ID),'",',
            '"GC_WEB": "',IIF(OLD.GC_WEB IS NULL, 'NULL',OLD.GC_WEB),'",',
            '"PEDIDO_INTEGRACAO_ID": "',IIF(OLD.PEDIDO_INTEGRACAO_ID IS NULL, 'NULL',OLD.PEDIDO_INTEGRACAO_ID),'",',
            '"CUPOM_CODIGO": "',IIF(OLD.CUPOM_CODIGO IS NULL, 'NULL',OLD.CUPOM_CODIGO),'",',
            '"WORKFLOW_ITEM_ID": "',IIF(OLD.WORKFLOW_ITEM_ID IS NULL, 'NULL',OLD.WORKFLOW_ITEM_ID),'",',
            '"PRE_PEDIDO_ID": "',IIF(OLD.PRE_PEDIDO_ID IS NULL, 'NULL',OLD.PRE_PEDIDO_ID),'",',
            '"USUARIO":"',COALESCE((SELECT FIRST 1 UPPER(A.USUARIO) FROM TBUSUARIO A WHERE A.CODIGO = FN_CURRENT_USER_ID()),''),'"}'
        , '');

    EXECUTE PROCEDURE SPI_BACKUP('TBPEDIDO', OLD.PEDIDO, DADOS);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_b7i for tbpedido
inactive before insert position 7
AS
declare variable vEMAIL VarChar(500);
declare variable vREPRESENTANTE VarChar(100);
declare variable vCLIENTE VarChar(100);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
BEGIN
  if (New.Chave_Liberacao > 0) then
      Begin

        vEMAIL = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 235),'');
        if (vEMAIL <> '') then
            Begin
            vREPRESENTANTE = (Select First 1 NomeFantasia From TbEmpresa E Where E.Codigo = New.Representante_Codigo);
            vCLIENTE = (Select First 1 NomeFantasia From TbEmpresa E Where E.Codigo = New.Cliente_Codigo);
    
            vCORPO_EMAIL = blob_append(' PEDIDO:  ',NEW.PEDIDO ,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' DATA/HORA EMISSAO: ',FORMATDATETIME(New.Usuario_Data),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' REPRESENTANTE: ',NEW.REPRESENTANTE_CODIGO,' - ',:vREPRESENTANTE,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' CLIENTE: ',NEW.CLIENTE_CODIGO,' - ',:vCLIENTE,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' FORMA DE TRATAMENTO: ',IIF(NEW.FORMA_ANALISE='0','IMEDIATAMENTE','AGUARDAR 24 HORAS'),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                           ' OBSERVACOES: ',COALESCE(NEW.OBSERVACAO,''));
    
            Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora, modulo_email)
            Values (:vEmail, 0, 'GCWEB - ENTRADA DE PEDIDO AGUARDANDO CONFIRMACAO - '||NEW.PEDIDO, :vCORPO_EMAIL, 0, Current_TimeStamp, 5);
            End

      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_ficha_template_b02iu for tbpedido_ficha_template
active before insert or update position 1
AS
DECLARE VARIABLE HISTORICO BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE TIPO_CAMPO INTEGER;
BEGIN
    HISTORICO = blob_append(null,'');

    IF(INSERTING) THEN
    BEGIN
        IF(NEW.VALOR IS NOT NULL AND NEW.VALOR <> '') THEN
        BEGIN
            HISTORICO = blob_append(HISTORICO,'','->',NEW.VALOR);
        END
        ELSE
        BEGIN
            IF(NEW.VALOR IS NOT NULL AND NEW.VALOR <> 0) THEN
            BEGIN
                HISTORICO = blob_append(HISTORICO,'0','->',NEW.VALOR);
            END
        END

        IF (HISTORICO <> '') THEN
        BEGIN
           HISTORICO = blob_append('PED.FICHA ID:',NEW.TIPO_CODIGO,' ALTERADO ',HISTORICO);
           EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO', NEW.PEDIDO,FN_ELIPSES(HISTORICO,500));
        END
    END
    ELSE
    BEGIN
        IF(OLD.VALOR <> NEW.VALOR)THEN
        BEGIN
            HISTORICO = blob_append(HISTORICO,OLD.VALOR,'->',NEW.VALOR);
        END

        IF (HISTORICO <> '') THEN
        BEGIN
           HISTORICO = blob_append('PED.FICHA ID:',NEW.TIPO_CODIGO,' ALTERADO ',HISTORICO);
           EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO', NEW.PEDIDO,FN_ELIPSES(HISTORICO,500));
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b10d for tbpedido_item
active before delete position 1
AS
DECLARE VARIABLE DADOS BLOB SUB_TYPE 1 SEGMENT SIZE 80;
BEGIN

    DADOS = blob_append(
                '{"ESTABELECIMENTO_CODIGO":"',IIF(OLD.ESTABELECIMENTO_CODIGO IS NULL, 'NULL',OLD.ESTABELECIMENTO_CODIGO),'",',
                '"PEDIDO":"',IIF(OLD.PEDIDO IS NULL, 'NULL',OLD.PEDIDO),'",',
                '"SEQUENCIA":"',IIF(OLD.SEQUENCIA IS NULL, 'NULL',OLD.SEQUENCIA),'",',
                '"CLIENTE_CODIGO":"',IIF(OLD.CLIENTE_CODIGO IS NULL, 'NULL',OLD.CLIENTE_CODIGO),'",',
                '"PRODUTO_CODIGO":"',IIF(OLD.PRODUTO_CODIGO IS NULL, 'NULL',OLD.PRODUTO_CODIGO),'",',
                '"MODELO_CODIGO":"',IIF(OLD.MODELO_CODIGO IS NULL, 'NULL',OLD.MODELO_CODIGO),'",',
                '"TAMANHO":"',IIF(OLD.TAMANHO IS NULL, 'NULL',OLD.TAMANHO),'",',
                '"QUANTIDADE":"',IIF(OLD.QUANTIDADE IS NULL, 'NULL',OLD.QUANTIDADE),'",',
                '"VALOR":"',IIF(OLD.VALOR IS NULL, 'NULL',OLD.VALOR),'",',
                '"SITUACAO":"',IIF(OLD.SITUACAO IS NULL, 'NULL',OLD.SITUACAO),'",',
                '"T01":"',IIF(OLD.T01 IS NULL, 'NULL',OLD.T01),'",',
                '"T02":"',IIF(OLD.T02 IS NULL, 'NULL',OLD.T02),'",',
                '"T03":"',IIF(OLD.T03 IS NULL, 'NULL',OLD.T03),'",',
                '"T04":"',IIF(OLD.T04 IS NULL, 'NULL',OLD.T04),'",',
                '"T05":"',IIF(OLD.T05 IS NULL, 'NULL',OLD.T05),'",',
                '"T06":"',IIF(OLD.T06 IS NULL, 'NULL',OLD.T06),'",',
                '"T07":"',IIF(OLD.T07 IS NULL, 'NULL',OLD.T07),'",',
                '"T08":"',IIF(OLD.T08 IS NULL, 'NULL',OLD.T08),'",',
                '"T09":"',IIF(OLD.T09 IS NULL, 'NULL',OLD.T09),'",',
                '"T10":"',IIF(OLD.T10 IS NULL, 'NULL',OLD.T10),'",',
                '"T11":"',IIF(OLD.T11 IS NULL, 'NULL',OLD.T11),'",',
                '"T12":"',IIF(OLD.T12 IS NULL, 'NULL',OLD.T12),'",',
                '"T13":"',IIF(OLD.T13 IS NULL, 'NULL',OLD.T13),'",',
                '"T14":"',IIF(OLD.T14 IS NULL, 'NULL',OLD.T14),'",',
                '"T15":"',IIF(OLD.T15 IS NULL, 'NULL',OLD.T15),'",',
                '"T16":"',IIF(OLD.T16 IS NULL, 'NULL',OLD.T16),'",',
                '"T17":"',IIF(OLD.T17 IS NULL, 'NULL',OLD.T17),'",',
                '"T18":"',IIF(OLD.T18 IS NULL, 'NULL',OLD.T18),'",',
                '"T19":"',IIF(OLD.T19 IS NULL, 'NULL',OLD.T19),'",',
                '"T20":"',IIF(OLD.T20 IS NULL, 'NULL',OLD.T20),'",');

      DADOS = blob_append(DADOS, '"CONTROLE":"',IIF(OLD.CONTROLE IS NULL, 'NULL',OLD.CONTROLE),'",',
                '"DRAWBACK":"',IIF(OLD.DRAWBACK IS NULL, 'NULL',OLD.DRAWBACK),'",',
                '"MARCACAO":"',IIF(OLD.MARCACAO IS NULL, 'NULL',OLD.MARCACAO),'",',
                '"DATA_ENTREGA":"',IIF(OLD.DATA_ENTREGA IS NULL, 'NULL',OLD.DATA_ENTREGA),'",',
                '"ARTIGO":"',IIF(OLD.ARTIGO IS NULL, 'NULL',OLD.ARTIGO),'",',
                '"OBSERVACAO":"',IIF(OLD.OBSERVACAO IS NULL, 'NULL',OLD.OBSERVACAO),'",',
                '"VALOR_IPI":"',IIF(OLD.VALOR_IPI IS NULL, 'NULL',OLD.VALOR_IPI),'",',
                '"PERCENTUAL_IPI":"',IIF(OLD.PERCENTUAL_IPI IS NULL, 'NULL',OLD.PERCENTUAL_IPI),'",',
                '"PROCESSAR":"',IIF(OLD.PROCESSAR IS NULL, 'NULL',OLD.PROCESSAR),'",',
                '"PLANO_MESTRE":"',IIF(OLD.PLANO_MESTRE IS NULL, 'NULL',OLD.PLANO_MESTRE),'",',
                '"DATA_SISTEMA":"',IIF(OLD.DATA_SISTEMA IS NULL, 'NULL',OLD.DATA_SISTEMA),'",',
                '"VALOR_DESCONTO":"',IIF(OLD.VALOR_DESCONTO IS NULL, 'NULL',OLD.VALOR_DESCONTO),'",',
                '"VR_TAB":"',IIF(OLD.VR_TAB IS NULL, 'NULL',OLD.VR_TAB),'",',
                '"VR_TAB_ACRES":"',IIF(OLD.VR_TAB_ACRES IS NULL, 'NULL',OLD.VR_TAB_ACRES),'",',
                '"PEDIDO_REP":"',IIF(OLD.PEDIDO_REP IS NULL, 'NULL',OLD.PEDIDO_REP),'",',
                '"PESO":"',IIF(OLD.PESO IS NULL, 'NULL',OLD.PESO),'",',
                '"LOCALIZACAO_ID":"',IIF(OLD.LOCALIZACAO_ID IS NULL, 'NULL',OLD.LOCALIZACAO_ID),'",',
                '"DATA_INCLUSAO":"',IIF(OLD.DATA_INCLUSAO IS NULL, 'NULL',OLD.DATA_INCLUSAO),'",',
                '"COR_ID":"',IIF(OLD.COR_ID IS NULL, 'NULL',OLD.COR_ID),'",',
                '"COR_COND":"',IIF(OLD.COR_COND IS NULL, 'NULL',OLD.COR_COND),'",',
                '"DATA_PRODUCAO":"',IIF(OLD.DATA_PRODUCAO IS NULL, 'NULL',OLD.DATA_PRODUCAO),'",',
                '"DATA_CLIENTE":"',IIF(OLD.DATA_CLIENTE IS NULL, 'NULL',OLD.DATA_CLIENTE),'",',
                '"QTD_EST":"',IIF(OLD.QTD_EST IS NULL, 'NULL',OLD.QTD_EST),'",',
                '"QTD_AGP":"',IIF(OLD.QTD_AGP IS NULL, 'NULL',OLD.QTD_AGP),'",',
                '"QTD_REM":"',IIF(OLD.QTD_REM IS NULL, 'NULL',OLD.QTD_REM),'",',
                '"AGP_DT_PRD":"',IIF(OLD.AGP_DT_PRD IS NULL, 'NULL',OLD.AGP_DT_PRD),'",',
                '"AGP_DT_CLI":"',IIF(OLD.AGP_DT_CLI IS NULL, 'NULL',OLD.AGP_DT_CLI),'",',
                '"COR_QTD_MIN":"',IIF(OLD.COR_QTD_MIN IS NULL, 'NULL',OLD.COR_QTD_MIN),'",',
                '"COR_QTD_MULT":"',IIF(OLD.COR_QTD_MULT IS NULL, 'NULL',OLD.COR_QTD_MULT),'",',
                '"SOB_QTD_MIN":"',IIF(OLD.SOB_QTD_MIN IS NULL, 'NULL',OLD.SOB_QTD_MIN),'",',
                '"SOB_QTD_MULT":"',IIF(OLD.SOB_QTD_MULT IS NULL, 'NULL',OLD.SOB_QTD_MULT),'",',
                '"EST_MIN":"',IIF(OLD.EST_MIN IS NULL, 'NULL',OLD.EST_MIN),'",',
                '"SALESFORCE":"',IIF(OLD.SALESFORCE IS NULL, 'NULL',OLD.SALESFORCE),'",',
                '"PEDIDO_CLIENTE":"',IIF(OLD.PEDIDO_CLIENTE IS NULL, 'NULL',OLD.PEDIDO_CLIENTE),'",',
                '"QUANTIDADE_ALTERNATIVA":"',IIF(OLD.QUANTIDADE_ALTERNATIVA IS NULL, 'NULL',OLD.QUANTIDADE_ALTERNATIVA),'",',
                '"VALOR_ALTERNATIVO":"',IIF(OLD.VALOR_ALTERNATIVO IS NULL, 'NULL',OLD.VALOR_ALTERNATIVO),'",',
                '"CLASSIFICACAO":"',IIF(OLD.CLASSIFICACAO IS NULL, 'NULL',OLD.CLASSIFICACAO),'",',
                '"MARGEM":"',IIF(OLD.MARGEM IS NULL, 'NULL',OLD.MARGEM),'",',
                '"C_MPR":"',IIF(OLD.C_MPR IS NULL, 'NULL',OLD.C_MPR),'",',
                '"C_STP":"',IIF(OLD.C_STP IS NULL, 'NULL',OLD.C_STP),'",',
                '"C_MOD":"',IIF(OLD.C_MOD IS NULL, 'NULL',OLD.C_MOD),'",',
                '"C_MOI_PR":"',IIF(OLD.C_MOI_PR IS NULL, 'NULL',OLD.C_MOI_PR),'",',
                '"C_MOI_AB":"',IIF(OLD.C_MOI_AB IS NULL, 'NULL',OLD.C_MOI_AB),'",',
                '"PERCENTUAL_PERDA":"',IIF(OLD.PERCENTUAL_PERDA IS NULL, 'NULL',OLD.PERCENTUAL_PERDA),'",',
                '"DATA_PEDIDO":"',IIF(OLD.DATA_PEDIDO IS NULL, 'NULL',OLD.DATA_PEDIDO),'",',
                '"CONTAS":"',IIF(OLD.CONTAS IS NULL, 'NULL',OLD.CONTAS),'",',
                '"FRETE":"',IIF(OLD.FRETE IS NULL, 'NULL',OLD.FRETE),'",',
                '"COMISSAO":"',IIF(OLD.COMISSAO IS NULL, 'NULL',OLD.COMISSAO),'",',
                '"TRIBUTOS":"',IIF(OLD.TRIBUTOS IS NULL, 'NULL',OLD.TRIBUTOS),'",',
                '"PERCENTUAL_IR":"',IIF(OLD.PERCENTUAL_IR IS NULL, 'NULL',OLD.PERCENTUAL_IR),'",',
                '"AUMENTO_FEV2018":"',IIF(OLD.AUMENTO_FEV2018 IS NULL, 'NULL',OLD.AUMENTO_FEV2018),'",',
                '"AUMENTO_AGO2018":"',IIF(OLD.AUMENTO_AGO2018 IS NULL, 'NULL',OLD.AUMENTO_AGO2018),'",',
                '"DATA_DISPONIVEL":"',IIF(OLD.DATA_DISPONIVEL IS NULL, 'NULL',OLD.DATA_DISPONIVEL),'",',
                '"STATUS_DESALOCACAO":"',IIF(OLD.STATUS_DESALOCACAO IS NULL, 'NULL',OLD.STATUS_DESALOCACAO),'",',
                '"PERFIL":"',IIF(OLD.PERFIL IS NULL, 'NULL',OLD.PERFIL),'",',
                '"PERFIL_COR":"',IIF(OLD.PERFIL_COR IS NULL, 'NULL',OLD.PERFIL_COR),'",',
                '"VALOR_ORIGINAL":"',IIF(OLD.VALOR_ORIGINAL IS NULL, 'NULL',OLD.VALOR_ORIGINAL),'",',
                '"VALOR_MANUAL":"',IIF(OLD.VALOR_MANUAL IS NULL, 'NULL',OLD.VALOR_MANUAL),'",',
                '"AUMENTO_SET2020":"',IIF(OLD.AUMENTO_SET2020 IS NULL, 'NULL',OLD.AUMENTO_SET2020),'",',
                '"TAXA_MOEDA":"',IIF(OLD.TAXA_MOEDA IS NULL, 'NULL',OLD.TAXA_MOEDA),'",',
                '"VALOR_UNIT_ESTRANGEIRO":"',IIF(OLD.VALOR_UNIT_ESTRANGEIRO IS NULL, 'NULL',OLD.VALOR_UNIT_ESTRANGEIRO),'",',
                '"PERCENTUAL_DESCONTO":"',IIF(OLD.PERCENTUAL_DESCONTO IS NULL, 'NULL',OLD.PERCENTUAL_DESCONTO),'",',
                '"PERCENTUAL_ACRESCIMO":"',IIF(OLD.PERCENTUAL_ACRESCIMO IS NULL, 'NULL',OLD.PERCENTUAL_ACRESCIMO),'",',
                '"VALOR_ACRESCIMO":"',IIF(OLD.VALOR_ACRESCIMO IS NULL, 'NULL',OLD.VALOR_ACRESCIMO),'",',
                '"REFERENCIA_PRECO_ID":"',IIF(OLD.REFERENCIA_PRECO_ID IS NULL, 'NULL',OLD.REFERENCIA_PRECO_ID),'",',
                '"GC_WEB":"',IIF(OLD.GC_WEB IS NULL, 'NULL',OLD.GC_WEB),'",',
                '"CLASS_MODCOR":"',IIF(OLD.CLASS_MODCOR IS NULL, 'NULL',OLD.CLASS_MODCOR),'",',
                '"CLASS_SKU":"',IIF(OLD.CLASS_SKU IS NULL, 'NULL',OLD.CLASS_SKU),'",',
                '"UM_ALTERNATIVA":"',IIF(OLD.UM_ALTERNATIVA IS NULL, 'NULL',OLD.UM_ALTERNATIVA),'",',
                '"ID":"',IIF(OLD.ID IS NULL, 'NULL',OLD.ID),'",',
                '"PERCENTUAL_COMISSAO":"',IIF(OLD.PERCENTUAL_COMISSAO IS NULL, 'NULL',OLD.PERCENTUAL_COMISSAO),'",',
                '"PERCENTUAL_DESCONTO1":"',IIF(OLD.PERCENTUAL_DESCONTO1 IS NULL, 'NULL',OLD.PERCENTUAL_DESCONTO1),'",',
                '"PERCENTUAL_DESCONTO2":"',IIF(OLD.PERCENTUAL_DESCONTO2 IS NULL, 'NULL',OLD.PERCENTUAL_DESCONTO2),'",',
                '"PERCENTUAL_DESCONTO3":"',IIF(OLD.PERCENTUAL_DESCONTO3 IS NULL, 'NULL',OLD.PERCENTUAL_DESCONTO3),'",',
                '"PEDIDO_ORIGINAL":"',IIF(OLD.PEDIDO_ORIGINAL IS NULL, 'NULL',OLD.PEDIDO_ORIGINAL),'",',
                '"ALTERANDO_CONFERENCIA":"',IIF(OLD.ALTERANDO_CONFERENCIA IS NULL, 'NULL',OLD.ALTERANDO_CONFERENCIA),'",',
                '"USUARIO":"',COALESCE((SELECT FIRST 1 UPPER(a.usuario) FROM TBUSUARIO A WHERE A.CODIGO = FN_CURRENT_USER_ID()),''),'"}'
           , '');

    EXECUTE PROCEDURE SPI_BACKUP('TBPEDIDO_ITEM', OLD.CONTROLE, DADOS);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_proc_b03d for tbpedido_item_processado
active before delete position 2
AS
DECLARE VARIABLE DADOS BLOB SUB_TYPE 1 SEGMENT SIZE 80;
BEGIN

   DADOS = blob_append(
         '{"PEDIDO_ITEM_CONTROLE":"',IIF(OLD.PEDIDO_ITEM_CONTROLE IS NULL, 'NULL',OLD.PEDIDO_ITEM_CONTROLE),'",', 
        '"CONTROLE":"',IIF(OLD.CONTROLE IS NULL, 'NULL',OLD.CONTROLE),'",', 
        '"ESTABELECIMENTO_CODIGO":"',IIF(OLD.ESTABELECIMENTO_CODIGO IS NULL, 'NULL',OLD.ESTABELECIMENTO_CODIGO),'",', 
        '"FAMILIA_CODIGO":"',IIF(OLD.FAMILIA_CODIGO IS NULL, 'NULL',OLD.FAMILIA_CODIGO),'",', 
        '"MODELO_CODIGO":"',IIF(OLD.MODELO_CODIGO IS NULL, 'NULL',OLD.MODELO_CODIGO),'",', 
        '"CLIENTE_CODIGO":"',IIF(OLD.CLIENTE_CODIGO IS NULL, 'NULL',OLD.CLIENTE_CODIGO),'",', 
        '"PEDIDO":"',IIF(OLD.PEDIDO IS NULL, 'NULL',OLD.PEDIDO),'",', 
        '"REMESSA":"',IIF(OLD.REMESSA IS NULL, 'NULL',OLD.REMESSA),'",', 
        '"REMESSA_ACUMULADO_CONTROLE":"',IIF(OLD.REMESSA_ACUMULADO_CONTROLE IS NULL, 'NULL',OLD.REMESSA_ACUMULADO_CONTROLE),'",', 
        '"TURNO_LIBERACAO":"',IIF(OLD.TURNO_LIBERACAO IS NULL, 'NULL',OLD.TURNO_LIBERACAO),'",', 
        '"TURNO_PRODUCAO":"',IIF(OLD.TURNO_PRODUCAO IS NULL, 'NULL',OLD.TURNO_PRODUCAO),'",', 
        '"ESTEIRA_LIBERACAO":"',IIF(OLD.ESTEIRA_LIBERACAO IS NULL, 'NULL',OLD.ESTEIRA_LIBERACAO),'",', 
        '"ESTEIRA_PRODUCAO":"',IIF(OLD.ESTEIRA_PRODUCAO IS NULL, 'NULL',OLD.ESTEIRA_PRODUCAO),'",', 
        '"SETOR_CODIGO":"',IIF(OLD.SETOR_CODIGO IS NULL, 'NULL',OLD.SETOR_CODIGO),'",', 
        '"PRODUTO_CODIGO":"',IIF(OLD.PRODUTO_CODIGO IS NULL, 'NULL',OLD.PRODUTO_CODIGO),'",', 
        '"EXPEDICAO_PRODUTO_CODIGO":"',IIF(OLD.EXPEDICAO_PRODUTO_CODIGO IS NULL, 'NULL',OLD.EXPEDICAO_PRODUTO_CODIGO),'",', 
        '"DATA_PROCESSAMENTO":"',IIF(OLD.DATA_PROCESSAMENTO IS NULL, 'NULL',OLD.DATA_PROCESSAMENTO),'",', 
        '"DATA_EXPEDICAO":"',IIF(OLD.DATA_EXPEDICAO IS NULL, 'NULL',OLD.DATA_EXPEDICAO),'",', 
        '"DATA_LIBERACAO":"',IIF(OLD.DATA_LIBERACAO IS NULL, 'NULL',OLD.DATA_LIBERACAO),'",', 
        '"DATA_PRODUCAO":"',IIF(OLD.DATA_PRODUCAO IS NULL, 'NULL',OLD.DATA_PRODUCAO),'",', 
        '"HORA_EXPEDICAO":"',IIF(OLD.HORA_EXPEDICAO IS NULL, 'NULL',OLD.HORA_EXPEDICAO),'",', 
        '"HORA_LIBERACAO":"',IIF(OLD.HORA_LIBERACAO IS NULL, 'NULL',OLD.HORA_LIBERACAO),'",', 
        '"HORA_PRODUCAO":"',IIF(OLD.HORA_PRODUCAO IS NULL, 'NULL',OLD.HORA_PRODUCAO),'",', 
        '"LOTE":"',IIF(OLD.LOTE IS NULL, 'NULL',OLD.LOTE),'",', 
        '"TAMANHO":"',IIF(OLD.TAMANHO IS NULL, 'NULL',OLD.TAMANHO),'",', 
        '"QUANTIDADE_PEDIDO":"',IIF(OLD.QUANTIDADE_PEDIDO IS NULL, 'NULL',OLD.QUANTIDADE_PEDIDO),'",', 
        '"QUANTIDADE_PRODUCAO":"',IIF(OLD.QUANTIDADE_PRODUCAO IS NULL, 'NULL',OLD.QUANTIDADE_PRODUCAO),'",', 
        '"QUANTIDADE_SALDO":"',IIF(OLD.QUANTIDADE_SALDO IS NULL, 'NULL',OLD.QUANTIDADE_SALDO),'",', 
        '"SITUACAO":"',IIF(OLD.SITUACAO IS NULL, 'NULL',OLD.SITUACAO),'",', 
        '"OPERADOR_ID_PRODUCAO":"',IIF(OLD.OPERADOR_ID_PRODUCAO IS NULL, 'NULL',OLD.OPERADOR_ID_PRODUCAO),'",', 
        '"OPERADOR":"',IIF(OLD.OPERADOR IS NULL, 'NULL',OLD.OPERADOR),'",', 
        '"PROGRAMACAO_CONTROLE":"',IIF(OLD.PROGRAMACAO_CONTROLE IS NULL, 'NULL',OLD.PROGRAMACAO_CONTROLE),'",', 
        '"PROGRAMACAO_SEQUENCIA":"',IIF(OLD.PROGRAMACAO_SEQUENCIA IS NULL, 'NULL',OLD.PROGRAMACAO_SEQUENCIA),'",', 
        '"PROGRAMACAO_TURNO":"',IIF(OLD.PROGRAMACAO_TURNO IS NULL, 'NULL',OLD.PROGRAMACAO_TURNO),'",', 
        '"COR_ID":"',IIF(OLD.COR_ID IS NULL, 'NULL',OLD.COR_ID),'",', 
        '"VOLUME":"',IIF(OLD.VOLUME IS NULL, 'NULL',OLD.VOLUME),'",', 
        '"PECA_CONJUNTO":"',IIF(OLD.PECA_CONJUNTO IS NULL, 'NULL',OLD.PECA_CONJUNTO),'",', 
        '"PROGRAMACAO_ESTEIRA":"',IIF(OLD.PROGRAMACAO_ESTEIRA IS NULL, 'NULL',OLD.PROGRAMACAO_ESTEIRA),'",', 
        '"PROGRAMACAO_BOCA":"',IIF(OLD.PROGRAMACAO_BOCA IS NULL, 'NULL',OLD.PROGRAMACAO_BOCA),'",', 
        '"VIA_ETIQUETA":"',IIF(OLD.VIA_ETIQUETA IS NULL, 'NULL',OLD.VIA_ETIQUETA),'",');

   DADOS = blob_append(DADOS,'"LIB":"',IIF(OLD.LIB IS NULL, 'NULL',OLD.LIB),'",',
        '"LOCALIZACAO_CODIGO":"',IIF(OLD.LOCALIZACAO_CODIGO IS NULL, 'NULL',OLD.LOCALIZACAO_CODIGO),'",', 
        '"REG_ESTOQUE":"',IIF(OLD.REG_ESTOQUE IS NULL, 'NULL',OLD.REG_ESTOQUE),'",', 
        '"STATUS_PRODUCAO":"',IIF(OLD.STATUS_PRODUCAO IS NULL, 'NULL',OLD.STATUS_PRODUCAO),'",', 
        '"AGRUPAMENTO_ID":"',IIF(OLD.AGRUPAMENTO_ID IS NULL, 'NULL',OLD.AGRUPAMENTO_ID),'",', 
        '"COLETA_ID":"',IIF(OLD.COLETA_ID IS NULL, 'NULL',OLD.COLETA_ID),'",', 
        '"ESTOQUE_ID":"',IIF(OLD.ESTOQUE_ID IS NULL, 'NULL',OLD.ESTOQUE_ID),'",', 
        '"DATAHORA":"',IIF(OLD.DATAHORA IS NULL, 'NULL',OLD.DATAHORA),'",', 
        '"QUANTIDADE_PRODUCAO_TMP":"',IIF(OLD.QUANTIDADE_PRODUCAO_TMP IS NULL, 'NULL',OLD.QUANTIDADE_PRODUCAO_TMP),'",', 
        '"QUANTIDADE_ALTERN":"',IIF(OLD.QUANTIDADE_ALTERN IS NULL, 'NULL',OLD.QUANTIDADE_ALTERN),'",', 
        '"QUANTIDADE_ALTERN_PRODUCAO":"',IIF(OLD.QUANTIDADE_ALTERN_PRODUCAO IS NULL, 'NULL',OLD.QUANTIDADE_ALTERN_PRODUCAO),'",', 
        '"QUANTIDADE_ALTERN_SALDO":"',IIF(OLD.QUANTIDADE_ALTERN_SALDO IS NULL, 'NULL',OLD.QUANTIDADE_ALTERN_SALDO),'",', 
        '"QUANTIDADE_ALTERN_PRODUCAO_TMP":"',IIF(OLD.QUANTIDADE_ALTERN_PRODUCAO_TMP IS NULL, 'NULL',OLD.QUANTIDADE_ALTERN_PRODUCAO_TMP),'",', 
        '"QUANTIDADE_SOBRA_TMP":"',IIF(OLD.QUANTIDADE_SOBRA_TMP IS NULL, 'NULL',OLD.QUANTIDADE_SOBRA_TMP),'",', 
        '"QUANTIDADE_SOBRA":"',IIF(OLD.QUANTIDADE_SOBRA IS NULL, 'NULL',OLD.QUANTIDADE_SOBRA),'",', 
        '"ESTOQUE_ID_BAIXA":"',IIF(OLD.ESTOQUE_ID_BAIXA IS NULL, 'NULL',OLD.ESTOQUE_ID_BAIXA),'",', 
        '"QUANTIDADE_BAIXA":"',IIF(OLD.QUANTIDADE_BAIXA IS NULL, 'NULL',OLD.QUANTIDADE_BAIXA),'",', 
        '"TURNO":"',IIF(OLD.TURNO IS NULL, 'NULL',OLD.TURNO),'",', 
        '"ACRESCIMO":"',IIF(OLD.ACRESCIMO IS NULL, 'NULL',OLD.ACRESCIMO),'",', 
        '"TALAO_DESMEMBRAMENTO":"',IIF(OLD.TALAO_DESMEMBRAMENTO IS NULL, 'NULL',OLD.TALAO_DESMEMBRAMENTO),'",', 
        '"ESTOQUE_ID_S_TRANSF":"',IIF(OLD.ESTOQUE_ID_S_TRANSF IS NULL, 'NULL',OLD.ESTOQUE_ID_S_TRANSF),'",', 
        '"ESTOQUE_ID_E_TRANSF":"',IIF(OLD.ESTOQUE_ID_E_TRANSF IS NULL, 'NULL',OLD.ESTOQUE_ID_E_TRANSF),'",', 
        '"MOTIVO_BAIXA":"',IIF(OLD.MOTIVO_BAIXA IS NULL, 'NULL',OLD.MOTIVO_BAIXA),'",', 
        '"TIPO_BAIXA":"',IIF(OLD.TIPO_BAIXA IS NULL, 'NULL',OLD.TIPO_BAIXA),'",', 
        '"CCUSTO_BAIXA":"',IIF(OLD.CCUSTO_BAIXA IS NULL, 'NULL',OLD.CCUSTO_BAIXA),'",', 
        '"OBSERVACAO":"',IIF(OLD.OBSERVACAO IS NULL, 'NULL',OLD.OBSERVACAO),'",', 
        '"FERRAMENTA_ID":"',IIF(OLD.FERRAMENTA_ID IS NULL, 'NULL',OLD.FERRAMENTA_ID),'",', 
        '"ENDERECAMENTO_ID":"',IIF(OLD.ENDERECAMENTO_ID IS NULL, 'NULL',OLD.ENDERECAMENTO_ID),'",', 
        '"FLAG_DATA":"',IIF(OLD.FLAG_DATA IS NULL, 'NULL',OLD.FLAG_DATA),'",', 
        '"MOTIVO_BAIXA_ID":"',IIF(OLD.MOTIVO_BAIXA_ID IS NULL, 'NULL',OLD.MOTIVO_BAIXA_ID),'",', 
        '"PERFIL":"',IIF(OLD.PERFIL IS NULL, 'NULL',OLD.PERFIL),'",', 
        '"STATUS_SALDO":"',IIF(OLD.STATUS_SALDO IS NULL, 'NULL',OLD.STATUS_SALDO),'",', 
        '"JUSTIFICATIVA_ID":"',IIF(OLD.JUSTIFICATIVA_ID IS NULL, 'NULL',OLD.JUSTIFICATIVA_ID),'",', 
        '"FLAG_COLETA":"',IIF(OLD.FLAG_COLETA IS NULL, 'NULL',OLD.FLAG_COLETA),'",', 
        '"PENDENTE_PROD":"',IIF(OLD.PENDENTE_PROD IS NULL, 'NULL',OLD.PENDENTE_PROD),'",', 
        '"ESTOQUE_ID_ESTORNO":"',IIF(OLD.ESTOQUE_ID_ESTORNO IS NULL, 'NULL',OLD.ESTOQUE_ID_ESTORNO),'",', 
        '"RECALCULAR_CONSUMO":"',IIF(OLD.RECALCULAR_CONSUMO IS NULL, 'NULL',OLD.RECALCULAR_CONSUMO),'",', 
        '"ESTOQUE_ID_RESIDUO":"',IIF(OLD.ESTOQUE_ID_RESIDUO IS NULL, 'NULL',OLD.ESTOQUE_ID_RESIDUO),'",', 
        '"PECA_CONJUNTO_ID":"',IIF(OLD.PECA_CONJUNTO_ID IS NULL, 'NULL',OLD.PECA_CONJUNTO_ID),'",', 
        '"PECA_CONJUNTO_SEQ":"',IIF(OLD.PECA_CONJUNTO_SEQ IS NULL, 'NULL',OLD.PECA_CONJUNTO_SEQ),'",', 
        '"PECA_CONJUNTO_NUM":"',IIF(OLD.PECA_CONJUNTO_NUM IS NULL, 'NULL',OLD.PECA_CONJUNTO_NUM),'",', 
        '"QUANTIDADE_DEFEITO":"',IIF(OLD.QUANTIDADE_DEFEITO IS NULL, 'NULL',OLD.QUANTIDADE_DEFEITO),'",', 
        '"MODELO_ORIGEM":"',IIF(OLD.MODELO_ORIGEM IS NULL, 'NULL',OLD.MODELO_ORIGEM),'",',
        '"USUARIO":"',COALESCE((SELECT FIRST 1 UPPER(A.USUARIO) FROM TBUSUARIO A WHERE A.CODIGO = FN_CURRENT_USER_ID()),''),'"}' 
        , '');

    EXECUTE PROCEDURE SPI_BACKUP('TBPEDIDO_ITEM_PROCESSADO', OLD.CONTROLE, DADOS);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_parada_b2i for tbregistro_parada
active before insert position 2
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable VJUSTIFICATIVA VarChar(200);
declare variable vOPERADOR_NOME VarChar(20);
declare variable VTEMPOORIGINAL Integer;

declare variable LINHA_ID INTEGER;
declare variable LINHA_DESCRICAO VARCHAR(50);
declare variable MODELO_ID INTEGER;                                                
declare variable MODELO_DESCRICAO VARCHAR(50);
declare variable COR_ID INTEGER;
declare variable COR_DESCRICAO VARCHAR(20);
declare variable TAMANHO INTEGER;
declare variable TAM_DESCRICAO VARCHAR(10);
declare variable FERRAMENTA_ID INTEGER;
declare variable FERRAMENTA_DESCRICAO VARCHAR(100);
declare variable GP_ID INTEGER;
declare variable GP_DESCRICAO VARCHAR(20);
declare variable UP_ID INTEGER;
declare variable UP_DESCRICAO VARCHAR(20);
declare variable ESTACAO INTEGER;
declare variable ESTACAO_DESCRICAO VARCHAR(20);
declare variable REMESSA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO INTEGER;
declare variable QUANTIDADE NUMERIC(18,4);
declare variable UM VARCHAR(10);

BEGIN

  if (New.Status > 0 and New.tabela = 'INEFICIENCIA') then -- ID da Justificativa
      Begin

      For
        Select first 1 P.Linha_Codigo Linha_Id,
            (Select First 1 L.Descricao From TbModelo_Linha L Where L.Codigo = P.Linha_Codigo) Linha_Descricao,
             P.Modelo_Codigo Modelo_Id,
            (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
             P.Cor_Codigo Cor_ID,
            (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
             PR.Tamanho,
            (Select First 1 Tam_Descricao From SP_TAMANHO_GRADE (P.Grade_Codigo,PR.Tamanho)) Tam_Descricao,
             PR.Ferramenta_ID,
            (Select First 1 F.Serie||'-'||F.Descricao From TbFerramentaria F Where F.ID = PR.Ferramenta_ID) Ferramenta_Descricao,
             PR.GP_Id,
            (Select First 1 G.Descricao From TBGP G Where G.ID = PR.Gp_ID) GP_Descricao,
             PR.UP_Id,
            (Select First 1 U.Descricao From TbUP U Where U.ID = PR.UP_ID) UP_Descricao,
             PR.Estacao,
            (Select First 1 S.Descricao From TbSub_UP S Where S.Up_ID = PR.Up_ID and S.ID = PR.Estacao) Estacao_Descricao,
             PR.Remessa_ID,
             PR.Tabela_ID Talao_ID,
            (Select First 1 R.Controle From TbRemessa_Item_Processado R Where R.Id = PR.Tabela_ID) Talao,
             PR.Quantidade, P.UNIDADEMEDIDA_SIGLA UM
        From TbProgramacao PR, TbProduto P
       Where PR.Produto_ID = P.Codigo
         and PR.ID = NEW.Tabela_ID
        Into :LINHA_ID,:LINHA_DESCRICAO,:MODELO_ID,:MODELO_DESCRICAO,:COR_ID,
             :COR_DESCRICAO,:TAMANHO,:TAM_DESCRICAO,:FERRAMENTA_ID,
             :FERRAMENTA_DESCRICAO,:GP_ID,:GP_DESCRICAO,:UP_ID,:UP_DESCRICAO,
             :ESTACAO,:ESTACAO_DESCRICAO,:REMESSA_ID,:TALAO_ID,:TALAO,:QUANTIDADE,:UM

          Do Begin

             vEMAIL         = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 239),'');
             vOPERADOR_NOME = Coalesce((Select First 1 O.Nome From TbOperador O Where O.Codigo = New.Operador_ID),'');
             VJUSTIFICATIVA = Coalesce((Select First 1 J.Descricao From TbJustificativa J Where J.ID = New.Status),'');
             VTEMPOORIGINAL = COALESCE((Select sum(MF.TM) from tbup_fluxo pf, TBMODELO_FLUXO_PRODUCAO mf
                                         where mf.fluxo_id  = pf.fluxo_id and pf.up_id = :UP_ID
                                           and mf.modelo_id = :MODELO_ID and mf.cor_id = :COR_ID
                                           and mf.tamanho   = :TAMANHO),0);

             if (vEMAIL <> '') then
                 Begin
                     vCORPO_EMAIL = blob_append(' LINHA: ',:LINHA_ID,' - ',:LINHA_DESCRICAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' MODELO: ',:MODELO_ID,' - ',:MODELO_DESCRICAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' COR: ',:COR_ID,' - ',:COR_DESCRICAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' TAMANHO: ',:TAM_DESCRICAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' FERRAMENTA: ',:FERRAMENTA_DESCRICAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' GP/UP/ESTACAO: ',:GP_DESCRICAO,'/',:UP_DESCRICAO,'/',:ESTACAO_DESCRICAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' REMESSA/TALAO: ',:REMESSA_ID,' - ',:TALAO,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' QUANTIDADE: ',Trunc(:QUANTIDADE),' ',:UM,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' OPERADOR: ',NEW.OPERADOR_ID,' - ',vOPERADOR_NOME,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' DATA/HORA REGISTRO: ',FORMATDATETIME(Current_TimeStamp),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' TEMPO MAQUINA ATUAL: ',Trunc(:VTEMPOORIGINAL),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',
                                    ' JUSTIFICATIVA: ',:vJustificativa,': ',NEW.OBSERVACAO)
                                    ;
    
                     Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora, modulo_email)
                     Values (:vEmail, 0, 'GC - REGISTRO DE JUSTIFICATIVA: '||:vJustificativa, :vCORPO_EMAIL, 0, Current_TimeStamp, 16);
                 End
    
             End
      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_consumo_b04d for tbremessa_consumo
active before delete position 2
AS
DECLARE VARIABLE DADOS BLOB SUB_TYPE 1 SEGMENT SIZE 80;
BEGIN

    DADOS = blob_append(
               '{"ESTABELECIMENTO_ID": "',IIF(old.ESTABELECIMENTO_ID IS NULL,'NULL',OLD.ESTABELECIMENTO_ID),'",',
                '"FAMILIA_ID": "',IIF(old.FAMILIA_ID IS NULL,'NULL',OLD.FAMILIA_ID),'",',
                '"REMESSA": "',IIF(old.REMESSA IS NULL,'NULL',OLD.REMESSA),'",',
                '"TALAO": "',IIF(old.TALAO IS NULL,'NULL',OLD.TALAO),'",',
                '"ID": "',IIF(old.ID IS NULL,'NULL',OLD.ID),'",',
                '"PRODUTO_ID": "',IIF(old.PRODUTO_ID IS NULL,'NULL',OLD.PRODUTO_ID),'",',
                '"TAMANHO": "',IIF(old.TAMANHO IS NULL,'NULL',OLD.TAMANHO),'",',
                '"LOCALIZACAO_ID": "',IIF(old.LOCALIZACAO_ID IS NULL,'NULL',OLD.LOCALIZACAO_ID),'",',
                '"DENSIDADE": "',IIF(old.DENSIDADE IS NULL,'NULL',OLD.DENSIDADE),'",',
                '"ESPESSURA": "',IIF(old.ESPESSURA IS NULL,'NULL',OLD.DENSIDADE),'",',
                '"COR_ID": "',IIF(old.COR_ID IS NULL,'NULL',OLD.COR_ID),'",',
                '"ESTEIRA_ID": "',IIF(old.ESTEIRA_ID IS NULL,'NULL',OLD.ESTEIRA_ID),'",',
                '"SETOR_ID": "',IIF(old.SETOR_ID IS NULL,'NULL',OLD.SETOR_ID),'",',
                '"FATOR_CONVERSAO": "',IIF(old.FATOR_CONVERSAO IS NULL,'NULL',OLD.FATOR_CONVERSAO),'",',
                '"QUANTIDADE": "',IIF(old.QUANTIDADE IS NULL,'NULL',OLD.QUANTIDADE),'",',
                '"CONSUMO_ML": "',IIF(old.CONSUMO_ML IS NULL,'NULL',OLD.CONSUMO_ML),'",',
                '"CONSUMO_KG": "',IIF(old.CONSUMO_KG IS NULL,'NULL',OLD.CONSUMO_KG),'",',
                '"QUANTIDADE_CONFERENCIA": "',IIF(old.QUANTIDADE_CONFERENCIA IS NULL,'NULL',OLD.QUANTIDADE_CONFERENCIA),'",',
                '"DATAHORA_CONFERENCIA": "',IIF(old.DATAHORA_CONFERENCIA IS NULL,'NULL',OLD.DATAHORA_CONFERENCIA),'",',
                '"USUARIO_ID": "',IIF(old.USUARIO_ID IS NULL,'NULL',OLD.USUARIO_ID),'",',
                '"CONTROLE_ESTOQUE": "',IIF(old.CONTROLE_ESTOQUE IS NULL,'NULL',OLD.CONTROLE_ESTOQUE),'",',
                '"CONFERENCIA": "',IIF(old.CONFERENCIA IS NULL,'NULL',OLD.CONFERENCIA),'",',
                '"REQUISICAO_ID": "',IIF(old.REQUISICAO_ID IS NULL,'NULL',OLD.REQUISICAO_ID),'",',
                '"JUSTIFICATIVA": "',IIF(old.JUSTIFICATIVA IS NULL,'NULL',OLD.JUSTIFICATIVA),'",',
                '"QUANTIDADE_ENCERRADA": "',IIF(old.QUANTIDADE_ENCERRADA IS NULL,'NULL',OLD.QUANTIDADE_ENCERRADA),'",',
                '"DATA": "',IIF(old.DATA IS NULL,'NULL',OLD.DATA),'",',
                '"CCUSTO": "',IIF(old.CCUSTO IS NULL,'NULL',OLD.CCUSTO),'",',
                '"QUEBRA": "',IIF(old.QUEBRA IS NULL,'NULL',OLD.QUEBRA),'",',
                '"SEGURANCA": "',IIF(old.SEGURANCA IS NULL,'NULL',OLD.SEGURANCA),'",',
                '"TALAO_DETALHE_ID": "',IIF(old.TALAO_DETALHE_ID IS NULL,'NULL',OLD.TALAO_DETALHE_ID),'",',
                '"CONTROLE": "',IIF(old.CONTROLE IS NULL,'NULL',OLD.CONTROLE),'",',
                '"QUANTIDADE_CONFERENCIA_ML": "',IIF(old.QUANTIDADE_CONFERENCIA_ML IS NULL,'NULL',OLD.QUANTIDADE_CONFERENCIA_ML),'",',
                '"COMPONENTE": "',IIF(old.COMPONENTE IS NULL,'NULL',OLD.COMPONENTE),'",',
                '"QUANTIDADE_SOBRA": "',IIF(old.QUANTIDADE_SOBRA IS NULL,'NULL',OLD.QUANTIDADE_SOBRA),'",',
                '"SALDO_BAIXAR": "',IIF(old.SALDO_BAIXAR IS NULL,'NULL',OLD.SALDO_BAIXAR),'",',
                '"QUANTIDADE_NECES": "',IIF(old.QUANTIDADE_NECES IS NULL,'NULL',OLD.QUANTIDADE_NECES),'",',
                '"QUANTIDADE_NECES_ALTERN": "',IIF(old.QUANTIDADE_NECES_ALTERN IS NULL,'NULL',OLD.QUANTIDADE_NECES_ALTERN),'",',
                '"DATAHORA": "',IIF(old.DATAHORA IS NULL,'NULL',OLD.DATAHORA),'",',
                '"FLAG_DATA": "',IIF(old.FLAG_DATA IS NULL,'NULL',OLD.FLAG_DATA),'",',
                '"LIBERAR_TOLERANCIA": "',IIF(old.LIBERAR_TOLERANCIA IS NULL,'NULL',OLD.LIBERAR_TOLERANCIA),'",',
                '"OPERADOR_LIBERACAO": "',IIF(old.OPERADOR_LIBERACAO IS NULL,'NULL',OLD.OPERADOR_LIBERACAO),'",',
                '"BAIXADO": "',IIF(old.BAIXADO IS NULL,'NULL',OLD.BAIXADO),'",',
                '"RESIDUO_BAIXADO": "',IIF(old.RESIDUO_BAIXADO IS NULL,'NULL',OLD.RESIDUO_BAIXADO),'",',
                '"USUARIO":"',COALESCE((SELECT FIRST 1 UPPER(a.usuario) FROM TBUSUARIO A WHERE A.CODIGO = FN_CURRENT_USER_ID()),''),'"}'
           ,'');

    EXECUTE PROCEDURE SPI_BACKUP('TBREMESSA_CONSUMO', OLD.ID, DADOS);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_proc_b04d for tbremessa_item_processado
active before delete position 2
AS
DECLARE VARIABLE DADOS BLOB SUB_TYPE 1 SEGMENT SIZE 80;
BEGIN

   DADOS = blob_append(
            '{"REMESSA" :"',IIF(OLD.REMESSA IS NULL, 'NULL',OLD.REMESSA),'",',
            '"CONTROLE" :"',IIF(OLD.CONTROLE IS NULL, 'NULL',OLD.CONTROLE),'",',
            '"ESTABELECIMENTO_CODIGO" :"',IIF(OLD.ESTABELECIMENTO_CODIGO IS NULL, 'NULL',OLD.ESTABELECIMENTO_CODIGO),'",',
            '"FAMILIA_CODIGO" :"',IIF(OLD.FAMILIA_CODIGO IS NULL, 'NULL',OLD.FAMILIA_CODIGO),'",',
            '"MODELO_CODIGO" :"',IIF(OLD.MODELO_CODIGO IS NULL, 'NULL',OLD.MODELO_CODIGO),'",',
            '"MATRIZ_CODIGO" :"',IIF(OLD.MATRIZ_CODIGO IS NULL, 'NULL',OLD.MATRIZ_CODIGO),'",',
            '"OPERADOR_CODIGO" :"',IIF(OLD.OPERADOR_CODIGO IS NULL, 'NULL',OLD.OPERADOR_CODIGO),'",',
            '"PRODUTO_CODIGO" :"',IIF(OLD.PRODUTO_CODIGO IS NULL, 'NULL',OLD.PRODUTO_CODIGO),'",',
            '"DATA_LIBERACAO" :"',IIF(OLD.DATA_LIBERACAO IS NULL, 'NULL',OLD.DATA_LIBERACAO),'",',
            '"DATA_PRODUCAO" :"',IIF(OLD.DATA_PRODUCAO IS NULL, 'NULL',OLD.DATA_PRODUCAO),'",',
            '"HORA_PRODUCAO" :"',IIF(OLD.HORA_PRODUCAO IS NULL, 'NULL',OLD.HORA_PRODUCAO),'",',
            '"HORA_LIBERACAO" :"',IIF(OLD.HORA_LIBERACAO IS NULL, 'NULL',OLD.HORA_LIBERACAO),'",',
            '"TAMANHO" :"',IIF(OLD.TAMANHO IS NULL, 'NULL',OLD.TAMANHO),'",',
            '"QUANTIDADE" :"',IIF(OLD.QUANTIDADE IS NULL, 'NULL',OLD.QUANTIDADE),'",',
            '"CHAPAS" :"',IIF(OLD.CHAPAS IS NULL, 'NULL',OLD.CHAPAS),'",',
            '"PLACAS" :"',IIF(OLD.PLACAS IS NULL, 'NULL',OLD.PLACAS),'",',
            '"SOBRAS" :"',IIF(OLD.SOBRAS IS NULL, 'NULL',OLD.SOBRAS),'",',
            '"CONSUMO_MEDIO" :"',IIF(OLD.CONSUMO_MEDIO IS NULL, 'NULL',OLD.CONSUMO_MEDIO),'",',
            '"OBSERVACAO" :"',IIF(OLD.OBSERVACAO IS NULL, 'NULL',OLD.OBSERVACAO),'",',
            '"SITUACAO" :"',IIF(OLD.SITUACAO IS NULL, 'NULL',OLD.SITUACAO),'",',
            '"PROGRAMACAO_CONTROLE" :"',IIF(OLD.PROGRAMACAO_CONTROLE IS NULL, 'NULL',OLD.PROGRAMACAO_CONTROLE),'",',
            '"PROGRAMACAO_SEQUENCIA" :"',IIF(OLD.PROGRAMACAO_SEQUENCIA IS NULL, 'NULL',OLD.PROGRAMACAO_SEQUENCIA),'",',
            '"ESPESSURA" :"',IIF(OLD.ESPESSURA IS NULL, 'NULL',OLD.ESPESSURA),'",',
            '"SOBRAS_" :"',IIF(OLD.SOBRAS_ IS NULL, 'NULL',OLD.SOBRAS_),'",',
            '"PLACAS_" :"',IIF(OLD.PLACAS_ IS NULL, 'NULL',OLD.PLACAS_),'",',
            '"DENSIDADE" :"',IIF(OLD.DENSIDADE IS NULL, 'NULL',OLD.DENSIDADE),'",',
            '"TOLERANCIA" :"',IIF(OLD.TOLERANCIA IS NULL, 'NULL',OLD.TOLERANCIA),'",',
            '"OPERADOR_LIBERACAO" :"',IIF(OLD.OPERADOR_LIBERACAO IS NULL, 'NULL',OLD.OPERADOR_LIBERACAO),'",',
            '"PROGRAMACAO_ESTEIRA" :"',IIF(OLD.PROGRAMACAO_ESTEIRA IS NULL, 'NULL',OLD.PROGRAMACAO_ESTEIRA),'",',
            '"PROGRAMACAO_BOCA" :"',IIF(OLD.PROGRAMACAO_BOCA IS NULL, 'NULL',OLD.PROGRAMACAO_BOCA),'",',
            '"PLANOMESTRE_ID" :"',IIF(OLD.PLANOMESTRE_ID IS NULL, 'NULL',OLD.PLANOMESTRE_ID),'",',
            '"LIB" :"',IIF(OLD.LIB IS NULL, 'NULL',OLD.LIB),'",',
            '"UP_ID" :"',IIF(OLD.UP_ID IS NULL, 'NULL',OLD.UP_ID),'",',
            '"OPERADOR_PRODUCAO" :"',IIF(OLD.OPERADOR_PRODUCAO IS NULL, 'NULL',OLD.OPERADOR_PRODUCAO),'",',
            '"LOCALIZACAO_ID" :"',IIF(OLD.LOCALIZACAO_ID IS NULL, 'NULL',OLD.LOCALIZACAO_ID),'",',
            '"TURNO" :"',IIF(OLD.TURNO IS NULL, 'NULL',OLD.TURNO),'",',
            '"REQUISICAO_ID" :"',IIF(OLD.REQUISICAO_ID IS NULL, 'NULL',OLD.REQUISICAO_ID),'",',
            '"PERC_SOBRA" :"',IIF(OLD.PERC_SOBRA IS NULL, 'NULL',OLD.PERC_SOBRA),'",',
            '"QUANTIDADE_SOBRA" :"',IIF(OLD.QUANTIDADE_SOBRA IS NULL, 'NULL',OLD.QUANTIDADE_SOBRA),'",',
            '"APROVEITAMENTO" :"',IIF(OLD.APROVEITAMENTO IS NULL, 'NULL',OLD.APROVEITAMENTO),'",',
            '"ESTOQUE_ID" :"',IIF(OLD.ESTOQUE_ID IS NULL, 'NULL',OLD.ESTOQUE_ID),'",',
            '"SEQ" :"',IIF(OLD.SEQ IS NULL, 'NULL',OLD.SEQ),'",',
            '"ID" :"',IIF(OLD.ID IS NULL, 'NULL',OLD.ID),'",',
            '"DATAHORA" :"',IIF(OLD.DATAHORA IS NULL, 'NULL',OLD.DATAHORA),'",',
            '"QUANTIDADE_ALTERNATIVA" :"',IIF(OLD.QUANTIDADE_ALTERNATIVA IS NULL, 'NULL',OLD.QUANTIDADE_ALTERNATIVA),'",',
            '"VIA_ETIQUETA" :"',IIF(OLD.VIA_ETIQUETA IS NULL, 'NULL',OLD.VIA_ETIQUETA),'",',
            '"OPERADOR_GP" :"',IIF(OLD.OPERADOR_GP IS NULL, 'NULL',OLD.OPERADOR_GP),'",',
            '"PERCENTUAL_TALAO_EXTRA" :"',IIF(OLD.PERCENTUAL_TALAO_EXTRA IS NULL, 'NULL',OLD.PERCENTUAL_TALAO_EXTRA),'",',
            '"TALAO_EXTRA" :"',IIF(OLD.TALAO_EXTRA IS NULL, 'NULL',OLD.TALAO_EXTRA),'",',
            '"TALAO_VINCULO" :"',IIF(OLD.TALAO_VINCULO IS NULL, 'NULL',OLD.TALAO_VINCULO),'",',
            '"FERRAMENTA_ID" :"',IIF(OLD.FERRAMENTA_ID IS NULL, 'NULL',OLD.FERRAMENTA_ID),'",',
            '"REPROCESSAR" :"',IIF(OLD.REPROCESSAR IS NULL, 'NULL',OLD.REPROCESSAR),'",',
            '"FLAG_DATA" :"',IIF(OLD.FLAG_DATA IS NULL, 'NULL',OLD.FLAG_DATA),'",',
            '"PERFIL" :"',IIF(OLD.PERFIL IS NULL, 'NULL',OLD.PERFIL),'",',
            '"PLACA_LARGURA" :"',IIF(OLD.PLACA_LARGURA IS NULL, 'NULL',OLD.PLACA_LARGURA),'",',
            '"PLACA_COMPRIMENTO" :"',IIF(OLD.PLACA_COMPRIMENTO IS NULL, 'NULL',OLD.PLACA_COMPRIMENTO),'",',
            '"PLACA_POR_CHAPA" :"',IIF(OLD.PLACA_POR_CHAPA IS NULL, 'NULL',OLD.PLACA_POR_CHAPA),'",',
            '"PLACA_TAM_SOBRA" :"',IIF(OLD.PLACA_TAM_SOBRA IS NULL, 'NULL',OLD.PLACA_TAM_SOBRA),'",',
            '"ENDERECAMENTO_ID" :"',IIF(OLD.ENDERECAMENTO_ID IS NULL, 'NULL',OLD.ENDERECAMENTO_ID),'",',
            '"STATUS_SALDO" :"',IIF(OLD.STATUS_SALDO IS NULL, 'NULL',OLD.STATUS_SALDO),'",',
            '"STATUS_FACCAO" :"',IIF(OLD.STATUS_FACCAO IS NULL, 'NULL',OLD.STATUS_FACCAO),'",',
            '"ACUMULADO_ID" :"',IIF(OLD.ACUMULADO_ID IS NULL, 'NULL',OLD.ACUMULADO_ID),'",',
            '"QUANTIDADE_ORIGINAL" :"',IIF(OLD.QUANTIDADE_ORIGINAL IS NULL, 'NULL',OLD.QUANTIDADE_ORIGINAL),'",',
            '"ENTRADA_CD" :"',IIF(OLD.ENTRADA_CD IS NULL, 'NULL',OLD.ENTRADA_CD),'",',
            '"DATA_ENTRADA_CD" :"',IIF(OLD.DATA_ENTRADA_CD IS NULL, 'NULL',OLD.DATA_ENTRADA_CD),'",',
            '"OPERADOR_ENTRADA_CD" :"',IIF(OLD.OPERADOR_ENTRADA_CD IS NULL, 'NULL',OLD.OPERADOR_ENTRADA_CD),'",',
            '"DATA_PROD_ENTRADA_CD" :"',IIF(OLD.DATA_PROD_ENTRADA_CD IS NULL, 'NULL',OLD.DATA_PROD_ENTRADA_CD),'",',
            '"ACUMULADO_CONTROLE" :"',IIF(OLD.ACUMULADO_CONTROLE IS NULL, 'NULL',OLD.ACUMULADO_CONTROLE),'",',
            '"PECA_CONJUNTO_ID" :"',IIF(OLD.PECA_CONJUNTO_ID IS NULL, 'NULL',OLD.PECA_CONJUNTO_ID),'",',
            '"PECA_CONJUNTO_SEQ" :"',IIF(OLD.PECA_CONJUNTO_SEQ IS NULL, 'NULL',OLD.PECA_CONJUNTO_SEQ),'",',
            '"USUARIO":"',COALESCE((SELECT FIRST 1 UPPER(A.USUARIO) FROM TBUSUARIO A WHERE A.CODIGO = FN_CURRENT_USER_ID()),''),'"}'
        , '');

    EXECUTE PROCEDURE SPI_BACKUP('TBREMESSA_ITEM_PROCESSADO', OLD.CONTROLE, DADOS);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_a01i for tbrequisicao_baixa_estoque
active after insert position 2
AS
declare variable usuario_id integer;
declare variable nivel integer;
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(500);
declare variable ASSUNTO varchar(500);
declare variable ASSUNTO_email varchar(500);
declare variable CORPO blob sub_type 1 segment size 80;
declare variable USUARIO VARCHAR(50);
declare variable DATA VARCHAR(16);
declare variable PRODUTO VARCHAR(150);
declare variable MOTIVO VARCHAR(50);
declare variable TIPO CHAR(50);
declare variable OPERACAO VARCHAR(200);
declare variable DESCRICAO VARCHAR(200);
declare variable QTD VARCHAR(50);
declare variable observacao blob sub_type 1 segment size 80;
declare variable notificar_email integer;
declare variable notificar_web integer;
declare variable max_nivel integer;
begin

    SELECT first 1
        coalesce(o4.nome, o4.usuario) as USUARIO,
        formatdatetime(t.data_inserte) as DATA,
        o5.codigo||' - '||o5.descricao as PRODUTO,
        o3.descricao as MOTIVO,
        iif(o2.tipo = 0, 'Transferência de estoque', iif(o2.tipo = 1, 'Baixa de estoque', '')) as TIPO,
        o2.descricao as OPERACAO,
        o1.descricao,
        (select FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.tipo, T.peca_id)) QTD,
        t.observacao,
        o1.notificar_email,
        01.NOTIFICAR_MSG
    FROM
        TBREQUISICAO_BAIXA_ESTOQUE T
        LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.id = T.regra_id
        LEFT JOIN tbregra_req_baixa_operacao O2 ON O2.id = T.operacao_id AND O2.regra_req_baixa_id = T.regra_id
        LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.id = T.motivo_id
        LEFT JOIN TBUSUARIO O4 ON O4.codigo = T.usuario_id
        LEFT JOIN tbproduto O5 ON O5.codigo = T.produto_id

    where t.id = new.id
    into
        USUARIO,
        DATA,
        PRODUTO,
        MOTIVO,
        TIPO,
        OPERACAO,
        DESCRICAO,
        QTD,
        observacao,
        notificar_email,
        notificar_web;

    USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
    DATA            = coalesce(DATA, '');
    PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
    MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
    TIPO            = FN_CAMEL_CASE(coalesce(TIPO, ''));
    OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
    DESCRICAO       = FN_CAMEL_CASE(coalesce(DESCRICAO, ''));
    QTD             = coalesce(QTD, '');
    observacao      = FN_CAMEL_CASE(coalesce(observacao, ''));
    notificar_email = coalesce(notificar_email, 0);
    notificar_web   = coalesce(notificar_web, 0);

    ASSUNTO = 'Nova Requisição de Estoque';
    ASSUNTO_email = 'Nova Requisição de Estoque, Usuário:'||USUARIO||', Produto:'||PRODUTO||', Quantidade:'||QTD;

    CORPO = blob_append('','<div style="display: -webkit-inline-box;">');
    CORPO = blob_append(CORPO,' <span style="font-weight: bold;">O Usuário: </span>',USUARIO,' <span style="font-weight: bold;">Solicita: </span>',TIPO,'<br>');
    CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Produto: </span>',PRODUTO,'<br>');
    CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Quantidade: </span>',QTD,'<br>');
    CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Data: </span>',DATA,'<br>');
    CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Motivo: </span>',MOTIVO,'<br>');
    CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Operação: </span>',OPERACAO,'<br>');
    CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Observação: </span>',observacao,'<br>');
    CORPO = blob_append(CORPO,'<br><a class="msg-balao-fechar" href="', fn_parametro('SISTEMA.URL_SERVER') ,'/_15220?ID=',new.id,'" target="_blank" >Clique aqui para ver</a>');
    CORPO = blob_append(CORPO,'</div>');


    select
            max(a.nivel)
    from TBREQUISICAO_AUTORIZADORES a
    where a.status = 1
    and a.requisicao_id = new.regra_id
    into :max_nivel;

  for
    select
        a.usuario_id,
        a.nivel
    from TBREQUISICAO_AUTORIZADORES a
    where a.status = 1
    and a.requisicao_id = new.regra_id
  into
    :usuario_id,
    :nivel
  do begin

    INSERT INTO TBREQ_BAIXA_AUTORIZADOR (REQUISICAO_BAIXA_ESTOQUE_ID, USUARIO_ID, STATUS, DATA_APROVACAO, NIVEL)
                             VALUES (new.id, :usuario_id, 0, null, :nivel );

    EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
    DESTINATARIO = coalesce((select first 1 u.email from tbusuario u where u.codigo = :usuario_id),'');

    if(notificar_web = 1 and :max_nivel = :nivel)then
    begin
        INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
           VALUES (
            1,
            :usuario_id,
            0,
            0,
            :ASSUNTO,
            0,
            0,
            current_timestamp,
            fn_current_user_id(),
            current_timestamp,
            0,
            '',
            0,
            :CORPO);
    end

    if(notificar_email = 1 and :max_nivel = :nivel)then
    begin
        INSERT INTO TBEMAIL (
            ID,
            EMAIL,
            USUARIO_ID,
            ASSUNTO,
            CORPO,
            STATUS,
            DATAHORA,
            MODULO_EMAIL
        ) VALUES (
            :EMAIL_ID,
            :DESTINATARIO,
            0,
            :ASSUNTO_email,
            :CORPO,
            0,
            CURRENT_TIMESTAMP,
            16
        );
   end

  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_a01u for tbrequisicao_baixa_estoque
active after update position 0
AS
declare variable usuario_id integer;
declare variable nivel integer;
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(500);
declare variable ASSUNTO varchar(500);
declare variable ASSUNTO_email varchar(500);
declare variable CORPO blob sub_type 1 segment size 80;
declare variable USUARIO VARCHAR(50);
declare variable DATA VARCHAR(16);
declare variable PRODUTO VARCHAR(150);
declare variable MOTIVO VARCHAR(50);
declare variable TIPO CHAR(50);
declare variable OPERACAO VARCHAR(200);
declare variable LABEL VARCHAR(200);
declare variable DESCRICAO VARCHAR(200);
declare variable QTD VARCHAR(50);
declare variable observacao blob sub_type 1 segment size 80;
declare variable notificar_email integer;
declare variable notificar_web integer;
begin

    if((new.status = 1 or new.status = 3) and old.status <> 2)then
    begin

        SELECT first 1
            coalesce(o4.nome, o4.usuario) as USUARIO,
            formatdatetime(t.data_inserte) as DATA,
            o5.codigo||' - '||o5.descricao as PRODUTO,
            o3.descricao as MOTIVO,
            iif(o2.tipo = 0, 'Transferência de estoque', iif(o2.tipo = 1, 'Baixa de estoque', '')) as TIPO,
            o2.descricao as OPERACAO,
            o1.descricao,
            (select FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.tipo, T.peca_id)) QTD,
            t.observacao,
            o1.notificar_email,
            01.NOTIFICAR_MSG
        FROM
            TBREQUISICAO_BAIXA_ESTOQUE T
            LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.id = T.regra_id
            LEFT JOIN tbregra_req_baixa_operacao O2 ON O2.id = T.operacao_id AND O2.regra_req_baixa_id = T.regra_id
            LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.id = T.motivo_id
            LEFT JOIN TBUSUARIO O4 ON O4.codigo = T.usuario_id
            LEFT JOIN tbproduto O5 ON O5.codigo = T.produto_id
    
        where t.id = new.id
        into
            USUARIO,
            DATA,
            PRODUTO,
            MOTIVO,
            TIPO,
            OPERACAO,
            DESCRICAO,
            QTD,
            observacao,
            notificar_email,
            notificar_web;
    
        USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
        DATA            = coalesce(DATA, '');
        PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
        MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
        TIPO            = FN_CAMEL_CASE(coalesce(TIPO, ''));
        OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
        DESCRICAO       = FN_CAMEL_CASE(coalesce(DESCRICAO, ''));
        QTD             = coalesce(QTD, '');
        observacao      = FN_CAMEL_CASE(coalesce(observacao, ''));
        notificar_email = coalesce(notificar_email, 0);
        notificar_web   = coalesce(notificar_web, 0);
    
        if(new.status = 1)then
        begin
            LABEL = 'AUTORIZADA';
        end else
        begin
            LABEL = 'RECUSADA';
        end

        ASSUNTO = 'Requisição de Estoque '||LABEL;
        ASSUNTO_email = 'Requisição de Estoque '||LABEL||', Produto:'||PRODUTO||', Quantidade:'||QTD;
    
        CORPO = blob_append('','<div style="display: -webkit-inline-box;">');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Produto: </span>',PRODUTO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Quantidade: </span>',QTD,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Data: </span>',DATA,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Motivo: </span>',MOTIVO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Operação: </span>',OPERACAO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Observação: </span>',observacao,'<br>');
        CORPO = blob_append(CORPO,'<br><a class="msg-balao-fechar" href="', fn_parametro('SISTEMA.URL_SERVER') ,'/_15200?ID=',new.id,'" target="_blank" >Clique aqui para ver</a>');
        CORPO = blob_append(CORPO,'</div>');

        EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
        DESTINATARIO = coalesce((select first 1 u.email from tbusuario u where u.codigo = new.usuario_id),'');
    
        if(notificar_web = 1)then
        begin
            INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
               VALUES (
                1,
                new.usuario_id,
                0,
                0,
                :ASSUNTO,
                0,
                0,
                current_timestamp,
                fn_current_user_id(),
                current_timestamp,
                0,
                '',
                0,
                :CORPO);
        end
    
        if(notificar_email = 1)then
        begin
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_email,
                :CORPO,
                0,
                CURRENT_TIMESTAMP,
                16
            );
       end

    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b03u for tbrequisicao_baixa_estoque
active before update position 0
AS
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE NIVEL INTEGER;
DECLARE VARIABLE EMAIL_ID INTEGER;
DECLARE VARIABLE DESTINATARIO VARCHAR(500);
DECLARE VARIABLE ASSUNTO VARCHAR(500);
DECLARE VARIABLE ASSUNTO_EMAIL VARCHAR(500);
DECLARE VARIABLE CORPO BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE USUARIO VARCHAR(50);
DECLARE VARIABLE DATA VARCHAR(16);
DECLARE VARIABLE PRODUTO VARCHAR(150);
DECLARE VARIABLE MOTIVO VARCHAR(50);
DECLARE VARIABLE TIPO CHAR(50);
DECLARE VARIABLE OPERACAO VARCHAR(200);
DECLARE VARIABLE DESCRICAO VARCHAR(200);
DECLARE VARIABLE QTD VARCHAR(50);
DECLARE VARIABLE OBSERVACAO BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE NOTIFICAR_EMAIL INTEGER;
DECLARE VARIABLE NOTIFICAR_WEB INTEGER;
DECLARE VARIABLE MAX_NIVEL INTEGER;
BEGIN
    IF(NEW.REGRA_ID <> OLD.REGRA_ID)THEN
    BEGIN

        DELETE FROM TBREQ_BAIXA_AUTORIZADOR X WHERE X.REQUISICAO_BAIXA_ESTOQUE_ID = OLD.ID;
        
        SELECT FIRST 1
            COALESCE(O4.NOME, O4.USUARIO) AS USUARIO,
            FORMATDATETIME(T.DATA_INSERTE) AS DATA,
            O5.CODIGO||' - '||O5.DESCRICAO AS PRODUTO,
            O3.DESCRICAO AS MOTIVO,
            IIF(O2.TIPO = 0, 'Transferência de estoque', IIF(O2.TIPO = 1, 'Baixa de estoque', '')) AS TIPO,
            O2.DESCRICAO AS OPERACAO,
            O1.DESCRICAO,
            (SELECT FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.TIPO, T.PECA_ID)) QTD,
            T.OBSERVACAO,
            O1.NOTIFICAR_EMAIL,
            01.NOTIFICAR_MSG
        FROM
            TBREQUISICAO_BAIXA_ESTOQUE T
            LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.ID = T.REGRA_ID
            LEFT JOIN TBREGRA_REQ_BAIXA_OPERACAO O2 ON O2.ID = T.OPERACAO_ID AND O2.REGRA_REQ_BAIXA_ID = T.REGRA_ID
            LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.ID = T.MOTIVO_ID
            LEFT JOIN TBUSUARIO O4 ON O4.CODIGO = T.USUARIO_ID
            LEFT JOIN TBPRODUTO O5 ON O5.CODIGO = T.PRODUTO_ID
    
        WHERE T.ID = NEW.ID
        INTO
            USUARIO,
            DATA,
            PRODUTO,
            MOTIVO,
            TIPO,
            OPERACAO,
            DESCRICAO,
            QTD,
            OBSERVACAO,
            NOTIFICAR_EMAIL,
            NOTIFICAR_WEB;
    
        USUARIO         = FN_CAPITALIZE(COALESCE(USUARIO, ''));
        DATA            = COALESCE(DATA, '');
        PRODUTO         = FN_CAMEL_CASE(COALESCE(PRODUTO, ''));
        MOTIVO          = FN_CAMEL_CASE(COALESCE(MOTIVO, ''));
        TIPO            = FN_CAMEL_CASE(COALESCE(TIPO, ''));
        OPERACAO        = FN_CAMEL_CASE(COALESCE(OPERACAO, ''));
        DESCRICAO       = FN_CAMEL_CASE(COALESCE(DESCRICAO, ''));
        QTD             = COALESCE(QTD, '');
        OBSERVACAO      = FN_CAMEL_CASE(COALESCE(OBSERVACAO, ''));
        NOTIFICAR_EMAIL = COALESCE(NOTIFICAR_EMAIL, 0);
        NOTIFICAR_WEB   = COALESCE(NOTIFICAR_WEB, 0);
    
        ASSUNTO = 'Nova Requisição de Estoque';
        ASSUNTO_email = 'Nova Requisição de Estoque, Usuário:'||USUARIO||', Produto:'||PRODUTO||', Quantidade:'||QTD;
    
        CORPO = blob_append('','<div style="display: -webkit-inline-box;">');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">O Usuário: </span>',USUARIO,' <span style="font-weight: bold;">Solicita: </span>',TIPO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Produto: </span>',PRODUTO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Quantidade: </span>',QTD,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Data: </span>',DATA,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Motivo: </span>',MOTIVO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Operação: </span>',OPERACAO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Observação: </span>',observacao,'<br>');
        CORPO = blob_append(CORPO,'<br><a class="msg-balao-fechar" href="', fn_parametro('SISTEMA.URL_SERVER') ,'/_15220?ID=',new.id,'" target="_blank" >Clique aqui para ver</a>');
        CORPO = blob_append(CORPO,'</div>');
    
    
        SELECT
                MAX(A.NIVEL)
        FROM TBREQUISICAO_AUTORIZADORES A
        WHERE A.STATUS = 1
        AND A.REQUISICAO_ID = NEW.REGRA_ID
        INTO :MAX_NIVEL;
    
      FOR
        SELECT
            A.USUARIO_ID,
            A.NIVEL
        FROM TBREQUISICAO_AUTORIZADORES A
        WHERE A.STATUS = 1
        AND A.REQUISICAO_ID = NEW.REGRA_ID
      INTO
        :USUARIO_ID,
        :NIVEL
      DO BEGIN
    
        INSERT INTO TBREQ_BAIXA_AUTORIZADOR (REQUISICAO_BAIXA_ESTOQUE_ID, USUARIO_ID, STATUS, DATA_APROVACAO, NIVEL)
                                 VALUES (NEW.ID, :USUARIO_ID, 0, NULL, :NIVEL );
    
        EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
        DESTINATARIO = COALESCE((SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID),'');
    
        IF(NOTIFICAR_WEB = 1 AND :MAX_NIVEL = :NIVEL)THEN
        BEGIN
            INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
               VALUES (
                1,
                :USUARIO_ID,
                0,
                0,
                :ASSUNTO,
                0,
                0,
                CURRENT_TIMESTAMP,
                FN_CURRENT_USER_ID(),
                CURRENT_TIMESTAMP,
                0,
                '',
                0,
                :CORPO);
        END
    
        IF(NOTIFICAR_EMAIL = 1 AND :MAX_NIVEL = :NIVEL)THEN
        BEGIN
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_EMAIL,
                :CORPO,
                0,
                CURRENT_TIMESTAMP,
                16
            );
       END
    
      END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbreq_baixa_autorizador_b02i for tbreq_baixa_autorizador
active before insert position 2
AS
begin

/*
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(500);
declare variable ASSUNTO varchar(500);
declare variable CORPO blob sub_type 1 segment size 80;
declare variable USUARIO VARCHAR(50);
declare variable DATA VARCHAR(16);
declare variable PRODUTO VARCHAR(150);
declare variable MOTIVO VARCHAR(50);
declare variable TIPO CHAR(20);
declare variable OPERACAO VARCHAR(200);
declare variable DESCRICAO VARCHAR(200);
declare variable QTD VARCHAR(50);
declare variable observacao blob sub_type 1 segment size 80;
begin

    SELECT first 1
        coalesce(o4.nome, o4.usuario) as USUARIO,
        formatdatetime(t.data_inserte) as DATA,
        o5.codigo||' - '||o5.descricao as PRODUTO,
        o3.descricao as MOTIVO,
        iif(o2.tipo = 0, 'Transferência', iif(o2.tipo = 1, 'Baixa', '')) as TIPO,
        o2.descricao as OPERACAO,
        o1.descricao,
        (select FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.tipo, T.peca_id)) QTD,
        t.observacao
    FROM
        TBREQUISICAO_BAIXA_ESTOQUE T
        LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.id = T.regra_id
        LEFT JOIN tbregra_req_baixa_operacao O2 ON O2.id = T.operacao_id AND O2.regra_req_baixa_id = T.regra_id
        LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.id = T.motivo_id
        LEFT JOIN TBUSUARIO O4 ON O4.codigo = T.usuario_id
        LEFT JOIN tbproduto O5 ON O5.codigo = T.produto_id

    where t.id = new.requisicao_baixa_estoque_id
    into
        USUARIO,
        DATA,
        PRODUTO,
        MOTIVO,
        TIPO,
        OPERACAO,
        DESCRICAO,
        QTD,
        observacao;

    ASSUNTO = 'Nova Requisição de Estoque';

    CORPO = blob_append(null, '');
    CORPO = blob_append(CORPO,'O Usuário:',USUARIO,' solicita ',TIPO,'<br>');
    CORPO = blob_append(CORPO,' Produto:',PRODUTO,'<br>');
    CORPO = blob_append(CORPO,' Quantidade:',QTD,'<br>');
    CORPO = blob_append(CORPO,' Data: ',DATA,'<br>');
    CORPO = blob_append(CORPO,' Motivo: ',MOTIVO,'<br>');
    CORPO = blob_append(CORPO,' Operação: ',OPERACAO,'<br>');
    CORPO = blob_append(CORPO,' Observação: ',observacao,'<br>');
    CORPO = blob_append(CORPO,'<br><a class="msg-balao-fechar" href="https://gc.delfa.com.br/_15220/',new.requisicao_baixa_estoque_id,'" target="_blank" >Clique aqui para ver</a>');

    EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
    DESTINATARIO = coalesce((select first 1 u.email from tbusuario u where u.codigo = new.usuario_id),'');

    INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
       VALUES (
        1,
        new.usuario_id,
        0,
        0,
        :ASSUNTO,
        0,
        0,
        current_timestamp,
        fn_current_user_id(),
        current_timestamp,
        0,
        '',
        0,
        :CORPO);


    INSERT INTO TBEMAIL (
        ID,
        EMAIL,
        USUARIO_ID,
        ASSUNTO,
        CORPO,
        STATUS,
        DATAHORA
    ) VALUES (
        :EMAIL_ID,
        :DESTINATARIO,
        0,
        :ASSUNTO,
        :CORPO,
        0,
        CURRENT_TIMESTAMP
    );
      */
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbreq_baixa_autorizador_b03u for tbreq_baixa_autorizador
active before update position 3
AS
declare variable usuario_id integer;
declare variable nivel integer;
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(500);
declare variable ASSUNTO varchar(500);
declare variable ASSUNTO_email varchar(500);
declare variable CORPO blob sub_type 1 segment size 80;
declare variable USUARIO VARCHAR(50);
declare variable DATA VARCHAR(16);
declare variable PRODUTO VARCHAR(150);
declare variable MOTIVO VARCHAR(50);
declare variable TIPO CHAR(50);
declare variable OPERACAO VARCHAR(200);
declare variable DESCRICAO VARCHAR(200);
declare variable QTD VARCHAR(50);
declare variable observacao blob sub_type 1 segment size 80;
declare variable notificar_email integer;
declare variable notificar_web integer;
declare variable max_nivel integer;
declare variable PENDENTES integer;
declare variable reprovacoes integer;
declare variable LISTA varchar(300);
begin

    --proximo nivel para notificar
    select
            max(a.nivel)
        from TBREQ_BAIXA_AUTORIZADOR a
        where a.status = 0
        and a.nivel < new.nivel
        and a.requisicao_baixa_estoque_id = new.requisicao_baixa_estoque_id
    into :max_nivel;

    max_nivel = coalesce(max_nivel,-1);

    --pendentes do nivel
    select
        count(R.id) as PENDENTES,
        list(coalesce(u.nome, u.usuario),', ') as LISTA
    from TBREQ_BAIXA_AUTORIZADOR R, tbusuario u
    WHERE R.requisicao_baixa_estoque_id = NEW.requisicao_baixa_estoque_id
    and r.id <> new.id
    AND R.status = 0
    and r.nivel  = new.nivel
    and u.codigo = r.usuario_id
    into PENDENTES, LISTA;

    PENDENTES = coalesce(PENDENTES,0);

    --reprovacoes
    select
        count(R.id) as PENDENTES
    from TBREQ_BAIXA_AUTORIZADOR R
    WHERE R.requisicao_baixa_estoque_id = NEW.requisicao_baixa_estoque_id
    AND R.status = 2
    into reprovacoes;

    reprovacoes = coalesce(reprovacoes,0);

  --se ainda tem niveis pendentes, se no nivel atual ja foi aprovada, se nao esta reprovando e se nao teve reprovacoes
  if(max_nivel >= 0 and PENDENTES = 0 and new.status <> 2 and reprovacoes = 0)then
  begin
        --notificar procimo nivel

        SELECT first 1
            coalesce(o4.nome, o4.usuario) as USUARIO,
            formatdatetime(t.data_inserte) as DATA,
            o5.codigo||' - '||o5.descricao as PRODUTO,
            o3.descricao as MOTIVO,
            iif(o2.tipo = 0, 'Transferência de estoque', iif(o2.tipo = 1, 'Baixa de estoque', '')) as TIPO,
            o2.descricao as OPERACAO,
            o1.descricao,
            (select FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.tipo, T.peca_id)) QTD,
            t.observacao,
            o1.notificar_email,
            01.NOTIFICAR_MSG
        FROM
            TBREQUISICAO_BAIXA_ESTOQUE T
            LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.id = T.regra_id
            LEFT JOIN tbregra_req_baixa_operacao O2 ON O2.id = T.operacao_id AND O2.regra_req_baixa_id = T.regra_id
            LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.id = T.motivo_id
            LEFT JOIN TBUSUARIO O4 ON O4.codigo = T.usuario_id
            LEFT JOIN tbproduto O5 ON O5.codigo = T.produto_id
        
        where t.id = new.requisicao_baixa_estoque_id
        into
            USUARIO,
            DATA,
            PRODUTO,
            MOTIVO,
            TIPO,
            OPERACAO,
            DESCRICAO,
            QTD,
            observacao,
            notificar_email,
            notificar_web;
    
        USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
        DATA            = coalesce(DATA, '');
        PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
        MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
        TIPO            = FN_CAMEL_CASE(coalesce(TIPO, ''));
        OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
        DESCRICAO       = FN_CAMEL_CASE(coalesce(DESCRICAO, ''));
        QTD             = coalesce(QTD, '');
        observacao      = FN_CAMEL_CASE(coalesce(observacao, ''));
        notificar_email = coalesce(notificar_email, 0);
        notificar_web   = coalesce(notificar_web, 0);
    
        ASSUNTO = 'Nova Requisição de Estoque';
        ASSUNTO_email = 'Nova Requisição de Estoque, Usuário:'||USUARIO||', Produto:'||PRODUTO||', Quantidade:'||QTD;
    
        CORPO = blob_append('','<div style="display: -webkit-inline-box;">');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">O Usuário: </span>',USUARIO,' <span style="font-weight: bold;">Solicita: </span>',TIPO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Produto: </span>',PRODUTO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Quantidade: </span>',QTD,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Data: </span>',DATA,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Motivo: </span>',MOTIVO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Operação: </span>',OPERACAO,'<br>');
        CORPO = blob_append(CORPO,' <span style="font-weight: bold;">Observação: </span>',observacao,'<br>');
        CORPO = blob_append(CORPO,'<br><a class="msg-balao-fechar" href="', fn_parametro('SISTEMA.URL_SERVER') ,'/_15220?ID=',new.id,'" target="_blank" >Clique aqui para ver</a>');
        CORPO = blob_append(CORPO,'</div>');
    
      for
        select
            a.usuario_id,
            a.nivel
        from TBREQ_BAIXA_AUTORIZADOR a
        where a.status = 0
        and a.requisicao_baixa_estoque_id = new.requisicao_baixa_estoque_id
        and a.nivel = :max_nivel
      into
        :usuario_id,
        :nivel
      do begin
    
        EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
        DESTINATARIO = coalesce((select first 1 u.email from tbusuario u where u.codigo = :usuario_id),'');
    
        if(notificar_web = 1 and :max_nivel = :nivel)then
        begin
            INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
               VALUES (
                1,
                :usuario_id,
                0,
                0,
                :ASSUNTO,
                0,
                0,
                current_timestamp,
                fn_current_user_id(),
                current_timestamp,
                0,
                '',
                0,
                :CORPO);
        end
    
        if(notificar_email = 1 and :max_nivel = :nivel)then
        begin
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_email,
                :CORPO,
                0,
                CURRENT_TIMESTAMP,
                16
            );
       end
    
      end
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02i for tbtaloes_avulsos
active before insert or update position 1
AS
declare variable data_prod_1 date;
declare variable data_prod_2 date;
declare variable status_prod_1 integer;
declare variable status_prod_2 integer;
declare variable nova_remessa integer;
declare variable ANO integer;
declare variable MES integer;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID varchar(10);
declare variable ABREVGP varchar(10);
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable TALAO_ID integer;
declare variable quantidade_producao numeric(15,4);
declare variable quantidade_alternativa numeric(15,4);
declare variable espessura numeric(15,4);
declare variable densidade numeric(15,4);
declare variable produto_id integer;
declare variable um varchar(10);
declare variable uma varchar(10);
declare variable fator numeric(15,4);
declare variable linha_codigo integer;
declare variable densidade_espessura integer;
declare variable ITEM_PROCESSADO integer;
declare variable localizacao_id integer;
declare variable perfil_sku varchar(10);
declare variable programacao_id integer;
declare variable TEMPO_TOTAL numeric(18,8);
declare variable TEMPO_SETUP numeric(18,8);
declare variable autorizaCAO varchar(300);
declare variable gerar_taloes integer;
declare variable USUARIO_NOTIFICAR integer;
declare variable corpo1 blob sub_type 1 segment size 80;
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    ESTABELECIMENTO_CODIGO = 1;

    select
        g.familia_id,
        p.id as PERFIL,
        FN_REPLACE(substring(g.descricao from 1 for 3),'.|-|1|2|3|4|5|6|7||9|0','') as ABREVGP
    from TBGP_UP s, tbgp g, tbup u, tbperfil p, tbfamilia f
    where g.id = new.gp_id
        and g.id = s.gp_id
        and s.up_id = u.id
        and u.perfil = p.id
        and p.tabela = 'UP'
        and u.id = new.up_id
        and f.codigo = g.familia_id
    into FAMILIA_ID, PERFIL_UP, ABREVGP;

    gerar_taloes = 0;

    IF(inserting)THEN
    BEGIN

        autorizaCAO = trim(fn_parametro('TBFAMILIA.AUTORIZAR_AVULSOS', :FAMILIA_ID));

        IF(autorizaCAO = '0')THEN
        BEGIN
          NEW.autorizacao = 1;
          gerar_taloes = 1;
        end ELSE
        BEGIN
          NEW.autorizacao = 0;
          gerar_taloes = 0;

          for
            select OSPLIT FROM split(:autorizaCAO, ',')
          INTO
            :USUARIO_NOTIFICAR
          DO BEGIN

            corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
            corpo1 = blob_append(corpo1 , '<p></p>');
            corpo1 = blob_append(corpo1 , '<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_22450?ID=',new.id,'" target="_blank">[ABRIR NA WEB]</a></p>');
            corpo1 = blob_append(corpo1 , '<br>');
            corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>ID: ',new.id,'</u></p>');
            corpo1 = blob_append(corpo1 , '<p><u>Usuário</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),''),'</p>');
            corpo1 = blob_append(corpo1 , '<p><u>Produto</u>: ',(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),'')),'</p>');
            corpo1 = blob_append(corpo1 , '<p><u>Quantidade</u>: ',replace(new.quantidade||'','.',','),'</p>');
            corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',new.observacao,'</p>');
            corpo1 = blob_append(corpo1 , '<br>');
            corpo1 = blob_append(corpo1 , '</body></html>');

            execute procedure SPI_NOTIFICAR(current_timestamp, :USUARIO_NOTIFICAR, 'Talão Avulso Pendente de autorização', :corpo1,1,1,16);

          END
        END

    END

    IF(updating)THEN
    BEGIN

        corpo1 = blob_append('','<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>');
        corpo1 = blob_append(corpo1 , '<p></p>');
        corpo1 = blob_append(corpo1 , '<p><a href="',fn_parametro('SISTEMA.URL_SERVER'),'/_22450?ID=',new.id,'" target="_blank">[ABRIR NA WEB]</a></p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '<p style="font-weight: bold;"><u>ID: ',new.id,'</u></p>');
        corpo1 = blob_append(corpo1 , '<p><u>Usuário</u>: ',coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),''),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Produto</u>: ',(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),'')),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Quantidade</u>: ',replace(new.quantidade||'','.',','),'</p>');
        corpo1 = blob_append(corpo1 , '<p><u>Observação</u>: ',new.observacao,'</p>');
        corpo1 = blob_append(corpo1 , '<br>');
        corpo1 = blob_append(corpo1 , '</body></html>');

      IF(OLD.autorizacao = 0 AND NEW.autorizacao = 1)THEN
      BEGIN
        HISTORICO = 'Aprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Tal??o Avulso Aprovado', :corpo1,1,1,16);

        gerar_taloes = 1;
      END ELSE
      BEGIN
        gerar_taloes = 0;
      END

      IF(OLD.autorizacao <> 2 AND NEW.autorizacao = 2)THEN
      BEGIN
        HISTORICO = 'Reprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);
        gerar_taloes = 0;

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Tal??o Avulso Reprovado', :corpo1,1,1,16);

      END

    END

    IF(gerar_taloes = 1)THEN
    BEGIN
        ABREVGP = fn_lpad(new.up_id, 4, '0');
    
        ANO = extract(year from current_timestamp);
        MES = extract(month from current_timestamp);
    
        nova_remessa =  coalesce((select first 1 s.remessa_id from TBTALOES_AVULSOS_REMESSAS s, tbremessa r where r.numero = s.remessa_id and s.ANO = :ANO and s.MES = :MES and s.gp_id = new.gp_id and s.up_id = new.up_id),0);
    
        if(nova_remessa = 0)then
        begin
            nova_remessa = GEN_ID(GTBREMESSA,1);
    
            INSERT INTO TBTALOES_AVULSOS_REMESSAS (REMESSA_ID, ANO, MES, GP_ID, PERFIL_UP, UP_ID) VALUES (:nova_remessa, :ANO, :MES, new.gp_id, :PERFIL_UP, new.up_id);
    
            --########################## - remessa - ###############################
            INSERT INTO TBREMESSA (
                NUMERO,
                ESTABELECIMENTO_CODIGO,
                FAMILIA_CODIGO,
                TURNO_CODIGO,
                DATA,
                USUARIO_CODIGO,
                TIPO,
                TONALIDADE,
                PROJECAO,
                OC,
                BLOQ,
                STATUS,
                REMESSA,
                AGRUPAMENTO_ID,
                FAMILIA_MP,
                REQUISICAO,
                DESCRICAO,
                DATA_BSC,
                DATAHORA,
                GP_ID,
                CONTROLE_TALAO,
                COMPONENTE,
                WEB,
                AMOSTRA,
                DATA_DISPONIBILIDADE,
                OBSERVACAO,
                EMPRESA_ID,
                DATA_PREVISAO,
                PERFIL,
                CLASSIFICACAO
            ) VALUES (
                :nova_remessa,
                :ESTABELECIMENTO_CODIGO,
                :FAMILIA_ID,
                NULL,
                '01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4),
                new.usuario_id,
                '1',
                '',
                '0',
                '0',
                '0',
                '1',
                :ABREVGP||'_'||lpad(:ano, 4)||lpad(:mes, 2),
                0,
                0,
                '0',
                NULL,
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                new.gp_id,
                '',
                '0',
                '1',
                '0',
                NULL,
                '',
                0,
                NULL,
                '1',
                ''
            );
        end
    
        if(nova_remessa = 0)then
        begin
          exception "..." 'Erro ao gerar remessa.';
        end
    
        new.talao_id = coalesce((select max(t.talao_id) from TBTALOES_AVULSOS t where t.remessa_id = :nova_remessa),0) + 1;
    
        new.remessa_id = :nova_remessa;
    
        -- ################################ - talao acumulado - ########################################
    
        select
            p.codigo,
            f.UNIDADEMEDIDA_SIGLA,
            f.UNIDADEMEDIDA_ALTERNATIVO,
            m.linha_codigo,
            m.densidade,
            m.espessura,
            f.densidade_espessura
        from tbproduto p, tbfamilia f, tbmodelo m
            where p.modelo_codigo = new.modelo_id
            and p.cor_codigo = new.cor_id
            and f.codigo = p.familia_codigo
            and m.codigo = new.modelo_id
            and p.status = '1'
            and m.status = '1'
            and f.status = '1'
        into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura;
    
        produto_id = coalesce(produto_id,0);
    
        if(produto_id = 0)then
        begin
           exception "..." 'Produto não encontrado. Verifique se tem um produto ativo com esse modelo e cor.';
        end
    
        quantidade_producao    = new.quantidade;
        quantidade_alternativa = 0;
        fator                  = coalesce(fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', :linha_codigo),0);
    
    
        if(char_length(trim(uma)) > 0)then
        begin
    
            if(fator = 0)then
            begin
              exception "..." 'Família com unidade de medida alternativa, mais fator não foi encontrado na linha. Linha:'||:linha_codigo||', Parametro:604 da linha.';
            end
    
            quantidade_producao    = new.quantidade / fator;
            quantidade_alternativa = new.quantidade;
        end
    
        if(coalesce(densidade_espessura,0) = 0)then
        begin
            Select
                Cast(Substring(Dens_Esp from 1 for 5) as Integer) Densidade,
                Cast(Substring(Dens_Esp from 6 for 5) as Numeric(15,2)) Espessura
            From (
                Select First 1
                Coalesce((Select First 1 lPad(M.Densidade,5,'0')||lPad(M.Espessura,5,'0')
                From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000') Dens_Esp
                From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                Where MC.Modelo_Id = new.modelo_id
                and MC.Cor_Id = new.cor_id
                and MC.Produto_Id = P2.Codigo
                and P2.Familia_Codigo = F.Codigo
                and F.Densidade_Espessura = '1'
                and((new.tamanho = 1 and MC.T01 > 0) or
                (new.tamanho = 2 and MC.T02 > 0) or
                (new.tamanho = 3 and MC.T03 > 0) or
                (new.tamanho = 4 and MC.T04 > 0) or
                (new.tamanho = 5 and MC.T05 > 0) or
                (new.tamanho = 6 and MC.T06 > 0) or
                (new.tamanho = 7 and MC.T07 > 0) or
                (new.tamanho = 8 and MC.T08 > 0) or
                (new.tamanho = 9 and MC.T09 > 0) or
                (new.tamanho =10 and MC.T10 > 0) or
                (new.tamanho =11 and MC.T11 > 0) or
                (new.tamanho =12 and MC.T12 > 0) or
                (new.tamanho =13 and MC.T13 > 0) or
                (new.tamanho =14 and MC.T14 > 0) or
                (new.tamanho =15 and MC.T15 > 0) or
                (new.tamanho =16 and MC.T16 > 0) or
                (new.tamanho =17 and MC.T17 > 0) or
                (new.tamanho =18 and MC.T18 > 0) or
                (new.tamanho =19 and MC.T19 > 0) or
                (new.tamanho =20 and MC.T20 > 0))
            ) into densidade, espessura;
    
        end
    
        TALAO_ID = GEN_ID(GTBREMESSA_ITEM_PROCESSADO,1);
    
        data_prod_1   = null;
        data_prod_2   = null;
        status_prod_1 = 1;
        status_prod_2 = 1;

        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            REMESSA,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            MATRIZ_CODIGO,
            OPERADOR_CODIGO,
            PRODUTO_CODIGO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_PRODUCAO,
            HORA_LIBERACAO,
            TAMANHO,
            QUANTIDADE,
            CHAPAS,
            PLACAS,
            SOBRAS,
            CONSUMO_MEDIO,
            OBSERVACAO,
            SITUACAO,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            ESPESSURA,
            SOBRAS_,
            PLACAS_,
            DENSIDADE,
            TOLERANCIA,
            OPERADOR_LIBERACAO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PLANOMESTRE_ID,
            LIB,
            UP_ID,
            OPERADOR_PRODUCAO,
            LOCALIZACAO_ID,
            TURNO,
            REQUISICAO_ID,
            PERC_SOBRA,
            QUANTIDADE_SOBRA,
            APROVEITAMENTO,
            ESTOQUE_ID,
            SEQ,
            ID,
            DATAHORA,
            QUANTIDADE_ALTERNATIVA,
            VIA_ETIQUETA,
            OPERADOR_GP,
            PERCENTUAL_TALAO_EXTRA,
            TALAO_EXTRA,
            TALAO_VINCULO,
            FERRAMENTA_ID,
            REPROCESSAR,
            FLAG_DATA,
            PERFIL
        ) VALUES (
            new.remessa_id,
            new.talao_id,
            :ESTABELECIMENTO_CODIGO,
            0,
            new.modelo_id,
            NULL,
            NULL,
            :produto_id,
            :data_prod_1,
            :data_prod_1,
            :data_prod_2,
            NULL,
            new.tamanho,
            :quantidade_producao,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            :status_prod_1,
            0,
            0,
            coalesce(:espessura,0),
            NULL,
            NULL,
            coalesce(:densidade,0),
            NULL,
            0,
            new.gp_id,
            1,
            0,
            '1',
            new.up_id,
            NULL,
            0,
            '',
            0,
            0,
            0,
            0,
            0,
            '',
            :TALAO_ID,
            current_timestamp,
            :quantidade_alternativa,
            0,
            0,
            NULL,
            NULL,
            NULL,
            NULL,
            0,
            0,
            NULL
        );
    
        --############################### - talao detalhado - ########################################
    
        ITEM_PROCESSADO = GEN_ID(GERADOR1_ID,1);
    
        localizacao_id = coalesce((select first 1 f.localizacao_codigo from TBFAMILIA f where f.codigo = :familia_id),0);
    
        :perfil_sku    = coalesce((select first 1 k.perfil from vwsku k where k.modelo_id = new.modelo_id and k.cor_id = new.cor_id and k.tamanho = new.tamanho),'');
    
        if(:perfil_sku = '')then
        begin
            exception "..." 'Erro ao consultar perfil do produto '||:produto_id;
        end
    
        INSERT INTO TBPEDIDO_ITEM_PROCESSADO (
            PEDIDO_ITEM_CONTROLE,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            CLIENTE_CODIGO,
            PEDIDO,
            REMESSA,
            REMESSA_ACUMULADO_CONTROLE,
            TURNO_LIBERACAO,
            TURNO_PRODUCAO,
            ESTEIRA_LIBERACAO,
            ESTEIRA_PRODUCAO,
            SETOR_CODIGO,
            PRODUTO_CODIGO,
            EXPEDICAO_PRODUTO_CODIGO,
            DATA_PROCESSAMENTO,
            DATA_EXPEDICAO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_EXPEDICAO,
            HORA_LIBERACAO,
            HORA_PRODUCAO,
            LOTE,
            TAMANHO,
            QUANTIDADE_PEDIDO,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
            SITUACAO,
            OPERADOR_ID_PRODUCAO,
            OPERADOR,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            PROGRAMACAO_TURNO,
            COR_ID,
            VOLUME,
            PECA_CONJUNTO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            VIA_ETIQUETA,
            LIB,
            LOCALIZACAO_CODIGO,
            REG_ESTOQUE,
            STATUS_PRODUCAO,
            AGRUPAMENTO_ID,
            COLETA_ID,
            ESTOQUE_ID,
            DATAHORA,
            QUANTIDADE_PRODUCAO_TMP,
            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            QUANTIDADE_ALTERN_PRODUCAO_TMP,
            QUANTIDADE_SOBRA_TMP,
            QUANTIDADE_SOBRA,
            ESTOQUE_ID_BAIXA,
            QUANTIDADE_BAIXA,
            TURNO,
            ACRESCIMO,
            TALAO_DESMEMBRAMENTO,
            ESTOQUE_ID_S_TRANSF,
            ESTOQUE_ID_E_TRANSF,
            MOTIVO_BAIXA,
            TIPO_BAIXA,
            CCUSTO_BAIXA,
            OBSERVACAO,
            FERRAMENTA_ID,
            ENDERECAMENTO_ID,
            FLAG_DATA,
            MOTIVO_BAIXA_ID,
            PERFIL
        )VALUES (
            0,
            :ITEM_PROCESSADO,
            :estabelecimento_codigo,
            0,
            new.modelo_id,
            NULL,
            NULL,
            new.remessa_id,
            new.talao_id,
            NULL,
            1,
            NULL,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            :data_prod_1,
            :data_prod_1,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            :quantidade_producao,
            :quantidade_producao,
            :status_prod_2,
            NULL,
            NULL,
            0,
            0,
            0,
            new.cor_id,
            0,
            1,
            new.gp_id,
            1,
            0,
            '0',
            :localizacao_id,
            '0',
            '0',
            0,
            NULL,
            0,
            current_timestamp,
            iif(:familia_id = 12, :quantidade_producao ,0),
            :quantidade_alternativa,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            NULL,
            NULL,
            NULL,
            '',
            '',
            '',
            NULL,
            NULL,
            NULL,
            0,
            0,
            :perfil_sku
        );
    
        localizacao_id = coalesce((select LOCALIZACAO_ID from SPC_ESTOQUE_TRANSACAO_REGRA(5,new.gp_id, :perfil_up, :produto_id, 'E', :ITEM_PROCESSADO)),0);
    
        if(:localizacao_id = 0)then
        begin
            exception "..." 'Erro ao consultar localização. Produto: '||:produto_id||', GP: '||new.gp_id||', Tipo: "E", Perfil: '||:perfil_up||' Regra: 5';
        end
    
        update TBPEDIDO_ITEM_PROCESSADO t set t.localizacao_codigo = :localizacao_id where t.controle = :ITEM_PROCESSADO;
    
    
        --################### - programacao - ####################
    
            TEMPO_TOTAL = 0;
            TEMPO_SETUP = 0;
            DELETE FROM TMP22040;
    
    
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               new.up_id,
               new.modelo_id,
               new.cor_id,
               new.tamanho,
               iif(coalesce(:quantidade_alternativa,0) = 0, :quantidade_producao, :quantidade_alternativa)
            );
                         
            --TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

            SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
            into :TEMPO_TOTAL, :TEMPO_SETUP;
    
            TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
            TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);
    
            IF ( TEMPO_TOTAL = 0 ) THEN
            BEGIN
                TEMPO_TOTAL = 1;
            END
    
            EXECUTE PROCEDURE SPI_PROGRAMACAO2(
                :estabelecimento_codigo,
                'A',
                new.gp_id,
                new.up_id,
                1,
                :TALAO_ID,
                0,
                0,
                :quantidade_producao,
                :TEMPO_TOTAL,
                new.remessa_id,
                current_date,
                :TEMPO_SETUP
            );

            if(false)then
            begin

                PROGRAMACAO_ID = COALESCE((SELECT FIRST 1 ID FROM TBPROGRAMACAO
                                           WHERE ESTABELECIMENTO_ID = :estabelecimento_codigo
                                             AND TIPO = 'A'
                                             AND TABELA_ID  = :TALAO_ID
                                             AND REMESSA_ID = new.remessa_id),0);

                data_prod_1   = current_date;
                data_prod_2   = current_timestamp;

                update tbremessa_item_processado l set l.situacao = 1 where l.remessa = new.remessa_id and l.controle = new.talao_id;
                update tbpedido_item_processado  h set h.quantidade_producao_tmp = h.quantidade_pedido, h.situacao = 2 where h.remessa = new.remessa_id and h.remessa_acumulado_controle = new.talao_id;
                update TBPROGRAMACAO a set a.status = '2', a.datahora_inicio = current_date, a.datahora_fim = current_date, a.operador_id = new.operador_id where a.id = :PROGRAMACAO_ID;

                update tbremessa_item_processado l set l.data_producao = :data_prod_1, l.data_liberacao = :data_prod_1, l.hora_producao  = :data_prod_2, l.situacao = 2 where l.remessa = new.remessa_id and l.controle = new.talao_id;
                update tbpedido_item_processado  h set h.quantidade_producao_tmp = h.quantidade_pedido, h.data_producao = :data_prod_1, h.data_liberacao = :data_prod_1, h.hora_producao  = :data_prod_2, h.situacao = 3 where h.remessa = new.remessa_id and h.remessa_acumulado_controle = new.talao_id;
                update TBPROGRAMACAO a set a.status = '3', a.datahora_inicio = current_date, a.datahora_fim = current_date, a.operador_id = new.operador_id where a.id = :PROGRAMACAO_ID;
            end
    
            --########################### - consumo - ############################
            execute procedure SPI_REM_CONSUMO_INSUMO_TALAO(:estabelecimento_codigo, new.remessa_id, new.talao_id);
     END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BOT_ESTOQUE_MINIMO_ATINGIDO (
    USUARIOS varchar(100),
    ESTABELECIMENTO integer,
    LOCALIZACAO integer)
as
declare variable USUARIO_ID integer;
declare variable VFAMILIA varchar(100);
declare variable VGRUPO_MODELO varchar(100);
declare variable FAMILIA varchar(100);
declare variable GRUPO_MODELO varchar(100);
declare variable PRODUTO varchar(200);
declare variable UM varchar(10);
declare variable TAM varchar(10);
declare variable ESTOQUE numeric(18,5);
declare variable EMPENHADO numeric(18,5);
declare variable COMPRADO numeric(18,5);
declare variable ESTOQUE_MIN numeric(18,5);
declare variable ESTOQUE_MAX numeric(18,5);
declare variable NECESSIDADE numeric(18,5);
declare variable STR_ESTOQUE varchar(20);
declare variable STR_EMPENHADO varchar(20);
declare variable STR_COMPRADO varchar(20);
declare variable STR_ESTOQUE_MIN varchar(20);
declare variable STR_ESTOQUE_MAX varchar(20);
declare variable STR_NECESSIDADE varchar(20);
declare variable MENSAGEM blob sub_type 1 segment size 80;
declare variable CONT integer;
BEGIN

  CONT = 0;
  vFAMILIA = '';
  vGRUPO_MODELO = '';

  MENSAGEM = blob_append(null, ' ``` ');
  MENSAGEM = blob_append(MENSAGEM , 'ESTOQUE MINIMO ATINGIDO #Q# ');

             FOR
                SELECT 
                SUBSTRING(FAMILIA FROM 1 FOR 30) AS FAMILIA,
                IIF(COALESCE(GRUPO_PRODUTO,'') <> '',
                    SUBSTRING(GRUPO_PRODUTO FROM 1 FOR 30),
                    SUBSTRING(MODELO FROM 1 FOR 30)) AS GRUPO_MODELO,
                FN_RPAD(SUBSTRING(PRODUTO FROM 1 FOR 30),17,'.') AS PRODUTO,
                SUBSTRING(UM FROM 1 FOR 2) AS UM,
                TAM_DESCRICAO,

                ESTOQUE,
                EMPENHADO,
                COMPRADO,
                ESTOQUE_MIN,
                ESTOQUE_MAX,
                NECESSIDADE,                                               
                FN_LPAD(FN_FORMAT_NUMBER2(ESTOQUE,    2),10,' ') AS STR_ESTOQUE,
                FN_LPAD(FN_FORMAT_NUMBER2(EMPENHADO,  2),10,' ') AS STR_EMPENHADO,
                FN_LPAD(FN_FORMAT_NUMBER2(COMPRADO,   2),10,' ') AS STR_COMPRADO,
                FN_LPAD(FN_FORMAT_NUMBER2(ESTOQUE_MIN,2),10,' ') AS STR_ESTOQUE_MIN,
                FN_LPAD(FN_FORMAT_NUMBER2(ESTOQUE_MAX,2),10,' ') AS STR_ESTOQUE_MAX,
                FN_LPAD(FN_FORMAT_NUMBER2(ABS(NECESSIDADE),2),10,' ') AS STR_NECESSIDADE
                FROM (
                      SELECT
                            FAMILIA_DESCRICAO AS FAMILIA,
                            FN_LPAD(PRODUTO_ID,6,'0')||'-'||PRODUTO_DESCRICAO AS PRODUTO,
                            UM,
                            TAM_DESCRICAO,
                            SALDO_ESTOQUE as ESTOQUE,
                            EMPENHADO,
                            SALDO_ESTOQUE - EMPENHADO as DISPONIVEL1,
                            COMPRADO,
                            SALDO_ESTOQUE - EMPENHADO + COMPRADO AS DISPONIVEL2,
                            ESTOQUE_MIN,
                            ESTOQUE_MAX,
                            IIF(SALDO_ESTOQUE - EMPENHADO + COMPRADO < ESTOQUE_MIN, ESTOQUE_MAX - (SALDO_ESTOQUE - EMPENHADO + COMPRADO), 0.0000) NECESSIDADE,
                            GRUPO_PRODUTO,
                            MODELO
                            FROM (
                                    SELECT A.ESTABELECIMENTO_ID,
                                           A.LOCALIZACAO_ID,
                                           F.CODIGO AS FAMILIA_ID,
                                           F.DESCRICAO AS FAMILIA_DESCRICAO,
                                           P.CODIGO AS PRODUTO_ID,
                                           P.DESCRICAO AS PRODUTO_DESCRICAO,
                                           A.TAM_DESCRICAO,
                                           A.ESTOQUE_MIN,
                                           A.ESTOQUE_MAX, 
                                          COALESCE(
                                          (SELECT IIF(A.TAMANHO = 0, S.SALDO,
                                                  IIF(A.TAMANHO = 1, S.T01_SALDO,
                                                  IIF(A.TAMANHO = 2, S.T02_SALDO,
                                                  IIF(A.TAMANHO = 3, S.T03_SALDO,
                                                  IIF(A.TAMANHO = 4, S.T04_SALDO,
                                                  IIF(A.TAMANHO = 5, S.T05_SALDO,
                                                  IIF(A.TAMANHO = 6, S.T06_SALDO,
                                                  IIF(A.TAMANHO = 7, S.T07_SALDO,
                                                  IIF(A.TAMANHO = 8, S.T08_SALDO,
                                                  IIF(A.TAMANHO = 9, S.T09_SALDO,
                                                  IIF(A.TAMANHO =10, S.T19_SALDO,
                                                  IIF(A.TAMANHO =11, S.T11_SALDO,
                                                  IIF(A.TAMANHO =12, S.T12_SALDO,
                                                  IIF(A.TAMANHO =13, S.T13_SALDO,
                                                  IIF(A.TAMANHO =14, S.T14_SALDO,
                                                  IIF(A.TAMANHO =15, S.T15_SALDO,
                                                  IIF(A.TAMANHO =16, S.T16_SALDO,
                                                  IIF(A.TAMANHO =17, S.T17_SALDO,
                                                  IIF(A.TAMANHO =18, S.T18_SALDO,
                                                  IIF(A.TAMANHO =19, S.T19_SALDO,
                                                  IIF(A.TAMANHO =20, S.T20_SALDO,0)))))))))))))))))))))
                                             FROM TBESTOQUE_SALDO S
                                            WHERE S.PRODUTO_CODIGO = A.PRODUTO_ID
                                              AND S.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_ID
                                              AND S.LOCALIZACAO_CODIGO = A.LOCALIZACAO_ID),0.0000) SALDO_ESTOQUE,
                            
                                           COALESCE(
                                          (SELECT IIF(A.TAMANHO = 0, SUM(Z.QUANTIDADE),
                                                  IIF(A.TAMANHO = 1, SUM(Z.T01),
                                                  IIF(A.TAMANHO = 2, SUM(Z.T02),
                                                  IIF(A.TAMANHO = 3, SUM(Z.T03),
                                                  IIF(A.TAMANHO = 4, SUM(Z.T04),
                                                  IIF(A.TAMANHO = 5, SUM(Z.T05),
                                                  IIF(A.TAMANHO = 6, SUM(Z.T06),
                                                  IIF(A.TAMANHO = 7, SUM(Z.T07),
                                                  IIF(A.TAMANHO = 8, SUM(Z.T08),
                                                  IIF(A.TAMANHO = 9, SUM(Z.T09),
                                                  IIF(A.TAMANHO =10, SUM(Z.T19),
                                                  IIF(A.TAMANHO =11, SUM(Z.T11),
                                                  IIF(A.TAMANHO =12, SUM(Z.T12),
                                                  IIF(A.TAMANHO =13, SUM(Z.T13),
                                                  IIF(A.TAMANHO =14, SUM(Z.T14),
                                                  IIF(A.TAMANHO =15, SUM(Z.T15),
                                                  IIF(A.TAMANHO =16, SUM(Z.T16),
                                                  IIF(A.TAMANHO =17, SUM(Z.T17),
                                                  IIF(A.TAMANHO =18, SUM(Z.T18),
                                                  IIF(A.TAMANHO =19, SUM(Z.T19),
                                                  IIF(A.TAMANHO =20, SUM(Z.T20),0)))))))))))))))))))))
                                            FROM TBOC X, TBOC_ITEM Y, TBOC_ITEM_SALDO Z
                                             WHERE X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
                                               AND X.OC = Y.OC
                                               AND Y.CONTROLE = Z.OC_ITEM_CONTROLE
                                               AND Y.SITUACAO = 1
                                               AND X.STATUS = 1
                                               AND Y.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_ID
                                               AND Y.LOCALIZACAO_CODIGO = A.LOCALIZACAO_ID
                                               AND Y.PRODUTO_CODIGO = P.CODIGO
                                               ),0.0000) COMPRADO,
                            
                                             COALESCE(
                                             (SELECT SUM(E.SALDO)
                                              FROM TBREMESSA_CONSUMO E
                                             WHERE E.CONFERENCIA = '0'
                                           --  AND COALESCE(E.COMPONENTE,'0') = '0'
                                               AND E.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_ID
                                               AND E.LOCALIZACAO_ID = A.LOCALIZACAO_ID
                                               AND E.PRODUTO_ID = P.CODIGO
                                               AND E.TAMANHO = A.TAMANHO
                                               AND E.SALDO > 0) ,0.0000) EMPENHADO,
                              
                                             P.UNIDADEMEDIDA_SIGLA AS UM,
                                             G.DESCRICAO AS GRUPO_PRODUTO,
                                             M.DESCRICAO AS MODELO
                            
                                    FROM VWESTOQUE_MINIMO A,
                                         TBFAMILIA F,
                                         TBPRODUTO P
                                         LEFT JOIN TBMODELO M ON M.CODIGO = P.MODELO_CODIGO
                                         LEFT JOIN TBGRUPO_PRODUTO G ON G.ID = P.GRUPO_PRODUTO_ID
                                    WHERE A.ESTOQUE_MIN > 0
                                      AND P.CODIGO = A.PRODUTO_ID
                                      AND F.CODIGO = P.FAMILIA_ALTERNATIVA
                                      AND A.ESTABELECIMENTO_ID = :ESTABELECIMENTO
                                      AND A.LOCALIZACAO_ID = :LOCALIZACAO
                                    ORDER BY A.ESTABELECIMENTO_ID, A.LOCALIZACAO_ID, F.DESCRICAO, G.DESCRICAO, M.DESCRICAO, P.DESCRICAO, A.TAM_DESCRICAO
                                 )
                            WHERE TRUE
                            AND SALDO_ESTOQUE < ESTOQUE_MIN
                            /*
                              TODOS
                              EST.FÍSICO MENOR QUE EST.MÍNIMO
                              EST.FÍSICO - EMPENHO MENOR QUE EST.MÍNIMO
                              EST.FÍSICO + COMPRADO MENOR QUE EST.MÍNIMO
                              EST.FÍSICO - EMPENHO + COMPRADO MENOR QUE EST.MÍNIMO
                            */
                     )
               -- WHERE SALDO > 0 and COMPRADO + ESTOQUE - SALDO < 0
               -- ORDER BY
               -- SUBSTRING (FAMILIA FROM 6 FOR 100),
               -- PRODUTO

             INTO :FAMILIA,
                  :GRUPO_MODELO,
                  :PRODUTO,
                  :UM,
                  :TAM,
                  :ESTOQUE,
                  :EMPENHADO,  
                  :COMPRADO,
                  :ESTOQUE_MIN,
                  :ESTOQUE_MAX,
                  :NECESSIDADE,
                  :STR_ESTOQUE, 
                  :STR_EMPENHADO,  
                  :STR_COMPRADO,
                  :STR_ESTOQUE_MIN,
                  :STR_ESTOQUE_MAX,
                  :STR_NECESSIDADE 

               DO BEGIN
                  CONT = 1;

                  if (vFAMILIA <> :FAMILIA) then
                      BEGIN
                        MENSAGEM = blob_append(:MENSAGEM , ' #Q# Fam.: ', :FAMILIA ,' #Q# ');
                        vFAMILIA = :FAMILIA;
                      END

                  if (vGRUPO_MODELO <> :GRUPO_MODELO) then
                      BEGIN
                        MENSAGEM = blob_append(:MENSAGEM , ' ' , :GRUPO_MODELO ,' #Q# ');
                        vGRUPO_MODELO   = :GRUPO_MODELO;
                      END

                  MENSAGEM = blob_append(MENSAGEM , ' > ' , :PRODUTO , ' ' , :TAM , ' #Q# ');
                  MENSAGEM = blob_append(MENSAGEM , ' ESTOQUE    : ' , :STR_ESTOQUE     , ' ' , :UM ,' #Q# ');
                 -- MENSAGEM = blob_append(MENSAGEM , ' EMPENHADO  : ' , :STR_EMPENHADO   , ' ' , :UM ,' #Q# ');
                 -- MENSAGEM = blob_append(MENSAGEM , ' COMPRADO   : ' , :STR_COMPRADO    , ' ' , :UM ,' #Q# ');
                  MENSAGEM = blob_append(MENSAGEM , ' EST.MÍNIMO : ' , :STR_ESTOQUE_MIN , ' ' , :UM ,' #Q# ');
                 -- MENSAGEM = blob_append(MENSAGEM , ' EST.MÁXIMO : ' , :STR_ESTOQUE_MAX , ' ' , :UM ,' #Q# ');
                 -- MENSAGEM = blob_append(MENSAGEM , ' NECESSIDADE: ' , :STR_NECESSIDADE , ' ' , :UM ,' #Q# ');

                  END

  MENSAGEM = blob_append(MENSAGEM , ' ``` ');
  if (CONT = 1) then
      BEGIN
        FOR
        SELECT CAST(OSPLIT AS INTEGER)
          FROM SPLIT (  :USUARIOS , ',' )
          INTO :USUARIO_ID
            DO BEGIN
               INSERT INTO TELEGRAM_MENSAGENS (USUARIO_ID, STATUS, DATAHORA, MSG) VALUES ( :USUARIO_ID, 1 , CURRENT_TIMESTAMP, :MENSAGEM ) ;
               END
      END

  -- vMENSAGEM = MENSAGEM;
  -- SUSPEND;

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BOT_NECESSIDADE_MP (
    USUARIOS varchar(100))
as
declare variable USUARIO_ID integer;
declare variable VFAMILIA varchar(100);
declare variable VGRUPO varchar(100);
declare variable FAMILIA varchar(100);
declare variable GRUPO varchar(100);
declare variable PRODUTO varchar(200);
declare variable UM varchar(10);
declare variable SALDO numeric(18,5);
declare variable ESTOQUE numeric(18,5);
declare variable NECESSIDADE numeric(18,5);
declare variable COMPRADO numeric(18,5);
declare variable STR_SALDO varchar(20);
declare variable STR_ESTOQUE varchar(20);
declare variable STR_NECESSIDADE varchar(20);
declare variable STR_COMPRADO varchar(20);
declare variable MENSAGEM blob sub_type 1 segment size 80;
declare variable CONT integer;
BEGIN

  CONT = 0;
  vFAMILIA = '';
  vGRUPO   = '';

  MENSAGEM = blob_append(null, ' ``` ');
  MENSAGEM = blob_append(MENSAGEM , 'NECESSIDADE DE COMPRA DE MP #Q# ');

             FOR
                SELECT 
                SUBSTRING(FAMILIA FROM 1 FOR 30) AS FAMILIA,
                SUBSTRING(GRUPO   FROM 1 FOR 30) AS GRUPO,
                FN_RPAD(SUBSTRING(PRODUTO FROM 1 FOR 15),17,'.') AS PRODUTO,
                SUBSTRING(UM   FROM 1 FOR 2) AS UM,
                SALDO,
                ESTOQUE,
                COMPRADO + ESTOQUE - SALDO AS NECESSIDADE,
                COMPRADO,
                FN_LPAD(FN_FORMAT_NUMBER2(SALDO,   2),10,' ') AS STR_SALDO,
                FN_LPAD(FN_FORMAT_NUMBER2(ESTOQUE, 2),10,' ') AS STR_ESTOQUE,
                FN_LPAD(FN_FORMAT_NUMBER2(ABS(COMPRADO + ESTOQUE - SALDO),2),10,' ') AS STR_NECESSIDADE,
                FN_LPAD(FN_FORMAT_NUMBER2(COMPRADO,2),10,' ') AS STR_COMPRADO
                FROM (
                        SELECT
                        FAMILIA,
                        GRUPO,
                        PRODUTO, 
                        UM,
                        SUM(EMPENHADO)EMPENHADO,
                        SUM(ATENDIDO) ATENDIDO,
                        SUM(ENCERRADO)ENCERRADO,
                        SUM(SALDO)    SALDO,
                        SUM(ESTOQUE)  ESTOQUE,
                        SUM(COMPRADO) COMPRADO
                        FROM (
                                  SELECT
                                  Z.FAMILIA,
                                  IIF(COALESCE(Z.GRUPO,'') = Z.PRODUTO_DESCRICAO OR COALESCE(Z.GRUPO,'') = '','*SEM GRUPO*',Z.GRUPO) AS GRUPO,
                        
                                  IIF(Z.GRUPO_PRODUTO_ID>0 AND COR<>'', /* FN_LPAD(Z.PRODUTO_ID,6,'0')||' - '|| */ COR,
                                                                        /* FN_LPAD(Z.PRODUTO_ID,6,'0')||' - '|| */ Z.PRODUTO_DESCRICAO) ||
                                  IIF(Z.TAMANHO>0,' TAM. '||(SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE(Z.GRADE_ID,Z.TAMANHO)),'') AS PRODUTO, 
                        
                                  Z.UM,
                                  Z.EMPENHADO, Z.ATENDIDO, Z.ENCERRADO, Z.SALDO,
                                  Z.ESTOQUE, Z.COMPRADO
                                  FROM (
                        
                                       SELECT  P.FAMILIA_ALTERNATIVA AS FAMILIA_ID,
                                               FN_LPAD(P.FAMILIA_ALTERNATIVA,4,'0')||' - '||(SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_ALTERNATIVA) FAMILIA,
                                               P.GRUPO_PRODUTO_ID,
                                               COALESCE((SELECT FIRST 1 G.DESCRICAO FROM TBGRUPO_PRODUTO G WHERE G.ID = P.GRUPO_PRODUTO_ID),'') AS GRUPO,
                                               X.PRODUTO_ID, P.DESCRICAO AS PRODUTO_DESCRICAO, P.UNIDADEMEDIDA_SIGLA UM,
                                               COALESCE(X.TAMANHO,0) AS TAMANHO,
                                               P.GRADE_CODIGO AS GRADE_ID,
                                               COALESCE((SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = P.COR_CODIGO),'') AS COR,
                                               X.EMPENHADO, X.ATENDIDO, X.ENCERRADO,
                                               X.EMPENHADO - X.ATENDIDO - X.ENCERRADO AS SALDO,
                                               X.SALDO_ESTOQUE AS ESTOQUE, X.COMPRADO
                                        FROM (
                
                                              SELECT E.ESTABELECIMENTO_ID, E.LOCALIZACAO_ID,
                                                     E.PRODUTO_ID, E.TAMANHO,
                                                     E.SALDO AS SALDO_ESTOQUE,
                                                     0.00 COMPRADO,
                                                     0 EMPENHADO, 0 ATENDIDO, 0 ENCERRADO
                                                FROM VWESTOQUE_SALDO_PRODUTO E
                                              UNION ALL
                                              SELECT O.ESTABELECIMENTO_ID, O.LOCALIZACAO_ID,
                                                     O.PRODUTO_ID, O.TAMANHO,
                                                     0.00 AS SALDO_ESTOQUE,
                                                     O.SALDO AS COMPRADO,
                                                     0 EMPENHADO, 0 ATENDIDO, 0 ENCERRADO
                                                FROM VWOC_ABERTO O
                                              UNION ALL
                                              SELECT E.ESTABELECIMENTO_ID, E.LOCALIZACAO_ID,
                                                     E.PRODUTO_ID, E.TAMANHO,
                                                     0.00 AS SALDO_ESTOQUE,
                                                     0.00 COMPRADO,
                                                     COALESCE(E.CONSUMO_KG,0.00) AS EMPENHADO,
                                                     COALESCE(E.QUANTIDADE_CONFERENCIA,0.00) AS ATENDIDO,
                                                     COALESCE(E.QUANTIDADE_ENCERRADA,0.00) AS ENCERRADO
                                               FROM TBREMESSA_CONSUMO E, VWREMESSA R, TBPRODUTO P 
                                              WHERE R.REMESSA_ID = E.REMESSA 
                                                AND P.CODIGO = E.PRODUTO_ID
                                                AND E.CONFERENCIA = '0' 
                                                AND COALESCE(E.COMPONENTE,'0') = '0'
                                                and (E.CONSUMO_KG - E.QUANTIDADE_CONFERENCIA - E.QUANTIDADE_ENCERRADA) > 0
                
                                          ) X, TBPRODUTO P
                                          WHERE P.CODIGO = X.PRODUTO_ID
                                  ) Z
                        )
                      GROUP BY FAMILIA, GRUPO, PRODUTO, UM
                     )
                WHERE SALDO > 0 and COMPRADO + ESTOQUE - SALDO < 0
                ORDER BY
                SUBSTRING (FAMILIA FROM 6 FOR 100),
                GRUPO,
                PRODUTO
             INTO :FAMILIA,
                  :GRUPO,
                  :PRODUTO,
                  :UM,
                  :SALDO,
                  :ESTOQUE,
                  :NECESSIDADE,
                  :COMPRADO,
                  :STR_SALDO,
                  :STR_ESTOQUE,
                  :STR_NECESSIDADE,
                  :STR_COMPRADO
               DO BEGIN
                  CONT = 1;

                  if (vFAMILIA <> :FAMILIA) then
                      BEGIN
                        MENSAGEM = blob_append(:MENSAGEM , ' #Q# Fam.', :FAMILIA ,' #Q# ');
                        vFAMILIA = :FAMILIA;
                      END

                  if (vGRUPO <> :GRUPO) then
                      BEGIN
                        MENSAGEM = blob_append(:MENSAGEM , ' ' , :GRUPO ,' #Q# ');
                        vGRUPO   = :GRUPO;
                      END

                  MENSAGEM = blob_append(MENSAGEM , ' >' , :PRODUTO , :STR_NECESSIDADE , :UM ,' #Q# ');

                  END

  MENSAGEM = blob_append(MENSAGEM , ' ``` ');
  if (CONT = 1) then
      BEGIN
        FOR
        SELECT CAST(OSPLIT AS INTEGER)
          FROM SPLIT (  :USUARIOS , ',' )
          INTO :USUARIO_ID
            DO BEGIN
               INSERT INTO TELEGRAM_MENSAGENS (USUARIO_ID, STATUS, DATAHORA, MSG) VALUES ( :USUARIO_ID, 1 , CURRENT_TIMESTAMP, :MENSAGEM ) ;
               END
      END

  -- vMENSAGEM = MENSAGEM;
  -- SUSPEND;

END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO (
    IPRODUTO_ID integer = 0,
    ITAMANHO integer = 0,
    IMODELO_ID integer = 0,
    IFAMILIA_ID integer = 0,
    IANO integer = 0,
    IMES integer = 0,
    I_FIRST integer = 999999,
    I_SKIP integer = 0)
returns (
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(100),
    COR_ID integer,
    COR_DESCRICAO varchar(100),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(20),
    PRODUTO_CONSUMO integer,
    TAMANHO_CONSUMO integer,
    ORIGEM integer,
    TS numeric(18,8),
    "TO" numeric(18,8),
    CMS numeric(18,8),
    CMO numeric(18,8),
    CMOIP numeric(18,8),
    CMOIA numeric(18,8),
    CSMOIP numeric(18,8),
    CSMOIA numeric(18,8),
    PERDA numeric(18,8),
    CONSUMO numeric(18,8),
    C numeric(18,8),
    T numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    COIP numeric(18,8),
    COIA numeric(18,8),
    CSIP numeric(18,8),
    CSIA numeric(18,8),
    CUSTO_MEDIO numeric(18,8),
    FATOR_CONVERSAO numeric(18,8),
    CUSTO_MINUTO numeric(18,8),
    MOI_PROPRIO numeric(18,8),
    MOI_ABSORVIDO numeric(18,8),
    DATA date,
    CUSTO numeric(18,8),
    DOLAR numeric(18,8),
    MARGEM numeric(18,4),
    OPERACIONAL numeric(18,8),
    INDIRETO numeric(18,8),
    ICMS numeric(18,8),
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8))
as
declare variable NIVEL integer;
declare variable ANO integer;
declare variable MES integer;
declare variable FLAG integer;
declare variable FLAG_TAMANHO integer;
declare variable H_ORIGEM varchar(200);
declare variable LINHAS integer;
declare variable C_LINHAS integer;
declare variable FATOR_SETUP integer;
declare variable VSQL blob sub_type 1 segment size 80;
begin
    C_LINHAS = 0;

    :FATOR_SETUP = coalesce((select first 1 RC.fator_setup FROM tbregra_calculo_custo RC WHERE RC.familia_producao = :IFAMILIA_ID AND RC.familia_id = RC.familia_producao),1);

    VSQL = blob_append('select
                first ',:i_first,'
                skip ',:i_skip,'
                *
            from(
                select
                    s.PRODUTO_ID,
                    s.PRODUTO_DESCRICAO,
                    s.MODELO_ID,
                    s.MODELO_DESCRICAO,
                    s.COR_ID,
                    s.COR_DESCRICAO,
                    s.TAMANHO,
                    s.TAMANHO_DESCRICAO,
                    count(s.PRODUTO_ID) over() as LINHAS
                from tbproduto p, SPC_SKUS(',:ifamilia_id,',',:imodelo_id,') s,
                (
                    select MODELO_ID, PRODUTO_ID from SPC_PRODUTOS_CUSTO_V2(',:ifamilia_id,',',:IANO,',',:IMES,',',:imodelo_id,')
                 ) m
                where p.codigo = s.PRODUTO_ID
                ',iif(:IPRODUTO_ID > 0, ' and p.codigo  = '||:IPRODUTO_ID, ' '),'
                ',iif(:ITAMANHO    > 0, ' and s.tamanho = '||:ITAMANHO   , ' '),'
                and m.MODELO_ID  = s.MODELO_ID
                and m.PRODUTO_ID = s.PRODUTO_ID
            )');

    for
        EXECUTE STATEMENT :VSQL
    into
        PRODUTO_ID,
        PRODUTO_DESCRICAO,
        MODELO_ID,
        MODELO_DESCRICAO,
        COR_ID,
        COR_DESCRICAO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        LINHAS
    do begin

        C_LINHAS = C_LINHAS + 1;
        for
            select first 1
                ANO,
                MES,
                NIVEL,
                PRODUTO_DESCRICAO,
                PRODUTO_CONSUMO,
                TAMANHO_CONSUMO,
                ORIGEM,
                TS,
                "TO",
                CMS,
                CMO,
                CMOIP,
                CMOIA,
                CSMOIP,
                CSMOIA,
                PERDA,
                CONSUMO,
                C,
                T,
                CS,
                CO,
                COIP,
                COIA,
                CSIP,
                CSIA,
                CUSTO_MEDIO,
                FATOR_CONVERSAO,
                TAMANHO,
                FLAG,
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                FLAG_TAMANHO,
                H_ORIGEM,
                DATA,
                CUSTO,
                DOLAR,
                MARGEM,
                OPERACIONAL,
                INDIRETO,
                ICMS,
                DEFEITOS,
                PRODUZIDO
            --from SPC_CALCULAR_CUSTO_V6(:Iano,:imes,:modelo_id,:cor_id,:tamanho,'',:modelo_id, :tamanho,0)
            from SPC_CALCULAR_ABSORVIDO(:Iano,:imes,:PRODUTO_ID,:tamanho, :FATOR_SETUP)

            where NIVEL = -1
        into
            ANO,
            MES,
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            TAMANHO_CONSUMO,
            ORIGEM,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            CONSUMO,
            C,
            T,
            CS,
            CO,
            COIP,
            COIA,
            CSIP,
            CSIA,
            CUSTO_MEDIO,
            FATOR_CONVERSAO,
            TAMANHO,
            FLAG,
            CUSTO_MINUTO,
            MOI_PROPRIO,
            MOI_ABSORVIDO,
            FLAG_TAMANHO,
            H_ORIGEM,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM,
            OPERACIONAL,
            INDIRETO,
            ICMS,
            DEFEITOS,
            PRODUZIDO
        do begin
            in autonomous transaction
            do begin
                UPDATE OR INSERT INTO TBCUSTO_PRODUTO (PRODUTO_ID, ANO, MES, NIVEL, PRODUTO_DESCRICAO, PRODUTO_CONSUMO, TAMANHO_CONSUMO, ORIGEM, TS, "TO", CMS, CMO, CMOIP, CMOIA, CSMOIP, CSMOIA, PERDA, C, T, CS, CO, CUSTO_MEDIO, FATOR_CONVERSAO, TAMANHO, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO, COIP, COIA, CSIP, CSIA, CONSUMO, FLAG_TAMANHO, DATA, CUSTO, DOLAR, MARGEM,OPERACIONAL,INDIRETO, ICMS, DEFEITOS, PRODUZIDO)
                                   VALUES (:PRODUTO_ID, :ANO, :MES, :NIVEL, :PRODUTO_DESCRICAO, :PRODUTO_CONSUMO, :TAMANHO_CONSUMO, :ORIGEM, :TS, :"TO", :CMS, :CMO, :CMOIP, :CMOIA, :CSMOIP, :CSMOIA, :PERDA, :C, :T, :CS, :CO, :CUSTO_MEDIO, :FATOR_CONVERSAO, :TAMANHO, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO, :COIP, :COIA, :CSIP, :CSIA, :CONSUMO, :FLAG_TAMANHO, :DATA, :CUSTO, :DOLAR, :MARGEM, :OPERACIONAL, :INDIRETO, :ICMS, :DEFEITOS, :PRODUZIDO)
                                 MATCHING (PRODUTO_ID, ANO, MES, TAMANHO);
            end
        end

        suspend;
    end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO_PRODUTO (
    IPRODUTO_ID integer = 0,
    ITAMANHO integer = 0,
    IMODELO_ID integer = 0,
    IFAMILIA_ID integer = 0,
    IANO integer = 0,
    IMES integer = 0,
    I_FIRST integer = 999999,
    I_SKIP integer = 0)
returns (
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(100),
    COR_ID integer,
    COR_DESCRICAO varchar(100),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(20),
    PRODUTO_CONSUMO integer,
    TAMANHO_CONSUMO integer,
    ORIGEM integer,
    TS numeric(18,8),
    "TO" numeric(18,8),
    CMS numeric(18,8),
    CMO numeric(18,8),
    CMOIP numeric(18,8),
    CMOIA numeric(18,8),
    CSMOIP numeric(18,8),
    CSMOIA numeric(18,8),
    PERDA numeric(18,8),
    CONSUMO numeric(18,8),
    C numeric(18,8),
    T numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    COIP numeric(18,8),
    COIA numeric(18,8),
    CSIP numeric(18,8),
    CSIA numeric(18,8),
    CUSTO_MEDIO numeric(18,8),
    FATOR_CONVERSAO numeric(18,8),
    CUSTO_MINUTO numeric(18,8),
    MOI_PROPRIO numeric(18,8),
    MOI_ABSORVIDO numeric(18,8),
    DATA date,
    CUSTO numeric(18,8),
    DOLAR numeric(18,8),
    MARGEM numeric(18,4),
    OPERACIONAL numeric(18,8),
    INDIRETO numeric(18,8),
    ICMS numeric(18,8),
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8),
    CUSTO_MEDIO_P numeric(18,8),
    C_P numeric(18,8),
    CUSTO_P numeric(18,8),
    ICMS_P numeric(18,8))
as
declare variable NIVEL integer;
declare variable ANO integer;
declare variable MES integer;
declare variable FLAG integer;
declare variable FLAG_TAMANHO integer;
declare variable H_ORIGEM varchar(200);
declare variable LINHAS integer;
declare variable C_LINHAS integer;
declare variable FATOR_SETUP integer;
declare variable VSQL blob sub_type 1 segment size 80;
begin
    C_LINHAS = 0;

    :FATOR_SETUP = coalesce((select first 1 RC.fator_setup FROM tbregra_calculo_custo RC WHERE RC.familia_producao = :IFAMILIA_ID AND RC.familia_id = RC.familia_producao),1);

    VSQL = blob_append('select
                first ',:i_first,'
                skip ',:i_skip,'
                *
            from(
                select
                    s.PRODUTO_ID,
                    s.PRODUTO_DESCRICAO,
                    s.MODELO_ID,
                    s.MODELO_DESCRICAO,
                    s.COR_ID,
                    s.COR_DESCRICAO,
                    s.TAMANHO,
                    s.TAMANHO_DESCRICAO,
                    count(s.PRODUTO_ID) over() as LINHAS
                from tbproduto p, SPC_SKUS(',:ifamilia_id,',',:imodelo_id,') s,
                (
                    select MODELO_ID, PRODUTO_ID from SPC_PRODUTOS_CUSTO_V2(',:ifamilia_id,',',:IANO,',',:IMES,',',:imodelo_id,')
                 ) m
                where p.codigo = s.PRODUTO_ID
                ',iif(:IPRODUTO_ID > 0, ' and p.codigo  = '||:IPRODUTO_ID, ' '),'
                ',iif(:ITAMANHO    > 0, ' and s.tamanho = '||:ITAMANHO   , ' '),'
                and m.MODELO_ID  = s.MODELO_ID
                and m.PRODUTO_ID = s.PRODUTO_ID
            )');

    for
        EXECUTE STATEMENT :VSQL
    into
        PRODUTO_ID,
        PRODUTO_DESCRICAO,
        MODELO_ID,
        MODELO_DESCRICAO,
        COR_ID,
        COR_DESCRICAO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        LINHAS
    do begin

        C_LINHAS = C_LINHAS + 1;
        for
            select first 1
                ANO,
                MES,
                NIVEL,
                PRODUTO_DESCRICAO,
                PRODUTO_CONSUMO,
                TAMANHO_CONSUMO,
                ORIGEM,
                TS,
                "TO",
                CMS,
                CMO,
                CMOIP,
                CMOIA,
                CSMOIP,
                CSMOIA,
                PERDA,
                CONSUMO,
                C,
                T,
                CS,
                CO,
                COIP,
                COIA,
                CSIP,
                CSIA,
                CUSTO_MEDIO,
                FATOR_CONVERSAO,
                TAMANHO,
                FLAG,
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                FLAG_TAMANHO,
                H_ORIGEM,
                DATA,
                CUSTO,
                DOLAR,
                MARGEM,
                OPERACIONAL,
                INDIRETO,
                ICMS,
                DEFEITOS,
                PRODUZIDO,
                CUSTO_MEDIO_P,
                C_P,
                CUSTO_P,
                ICMS_P
            --from SPC_CALCULAR_CUSTO_V6(:Iano,:imes,:modelo_id,:cor_id,:tamanho,'',:modelo_id, :tamanho,0)
            from SPC_CALCULAR_ABSORVIDO(:Iano,:imes,:PRODUTO_ID,:tamanho, :FATOR_SETUP)

            where NIVEL = -1
        into
            ANO,
            MES,
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            TAMANHO_CONSUMO,
            ORIGEM,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            CONSUMO,
            C,
            T,
            CS,
            CO,
            COIP,
            COIA,
            CSIP,
            CSIA,
            CUSTO_MEDIO,
            FATOR_CONVERSAO,
            TAMANHO,
            FLAG,
            CUSTO_MINUTO,
            MOI_PROPRIO,
            MOI_ABSORVIDO,
            FLAG_TAMANHO,
            H_ORIGEM,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM,
            OPERACIONAL,
            INDIRETO,
            ICMS,
            DEFEITOS,
            PRODUZIDO,
            CUSTO_MEDIO_P,
            C_P,
            CUSTO_P,
            ICMS_P
        do begin
            in autonomous transaction
            do begin
                UPDATE OR INSERT INTO TBCUSTO_PRODUTO (PRODUTO_ID, ANO, MES, NIVEL, PRODUTO_DESCRICAO, PRODUTO_CONSUMO, TAMANHO_CONSUMO, ORIGEM, TS, "TO", CMS, CMO, CMOIP, CMOIA, CSMOIP, CSMOIA, PERDA, C, T, CS, CO, CUSTO_MEDIO, FATOR_CONVERSAO, TAMANHO, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO, COIP, COIA, CSIP, CSIA, CONSUMO, FLAG_TAMANHO, DATA, CUSTO, DOLAR, MARGEM,OPERACIONAL,INDIRETO, ICMS, DEFEITOS, PRODUZIDO, CUSTO_MEDIO_P, C_P, CUSTO_P, ICMS_P)
                                   VALUES (:PRODUTO_ID, :ANO, :MES, :NIVEL, :PRODUTO_DESCRICAO, :PRODUTO_CONSUMO, :TAMANHO_CONSUMO, :ORIGEM, :TS, :"TO", :CMS, :CMO, :CMOIP, :CMOIA, :CSMOIP, :CSMOIA, :PERDA, :C, :T, :CS, :CO, :CUSTO_MEDIO, :FATOR_CONVERSAO, :TAMANHO, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO, :COIP, :COIA, :CSIP, :CSIA, :CONSUMO, :FLAG_TAMANHO, :DATA, :CUSTO, :DOLAR, :MARGEM, :OPERACIONAL, :INDIRETO, :ICMS, :DEFEITOS, :PRODUZIDO, :CUSTO_MEDIO_P, :C_P, :CUSTO_P, :ICMS_P)
                                 MATCHING (PRODUTO_ID, ANO, MES, TAMANHO);
            end
        end

        suspend;
    end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_EMAIL_PEDIDOS_ATRASADOS
returns (
    HTML blob sub_type 0 segment size 80,
    EMAIL varchar(200),
    OLD_REPRESENTANTE_EMAIL varchar(300))
as
declare variable CORPO1 blob sub_type 0 segment size 80;
declare variable CORPO2 blob sub_type 0 segment size 80;
declare variable TABELA blob sub_type 0 segment size 80;
declare variable TABELA2 blob sub_type 0 segment size 80;
declare variable TABELA3 blob sub_type 0 segment size 80;
declare variable REPRESENTANTE varchar(200);
declare variable CLIENTE varchar(200);
declare variable PEDIDO integer;
declare variable DATA varchar(20);
declare variable DATA_CLIENTE varchar(20);
declare variable DIAS_ATRASO integer;
declare variable QUANTIDADE integer;
declare variable SALDO_A_FATURAR integer;
declare variable PERCENT numeric(15,2);
declare variable REPRESENTANTE_ID integer;
declare variable CONT_LINHAS integer;
declare variable DISPONIVEL integer;
declare variable PERC_DISPONIVEL numeric(15,2);
declare variable REPRESENTANTE_EMAIL varchar(300);
declare variable OLD_REPRESENTANTE_ID integer;
declare variable HTML_GERAL blob sub_type 0 segment size 80;
BEGIN

    tabela =  blob_append(null,  '<table class="tbl"><thead><tr>'||
                '<th class="col-0">Representante</th>'||
                '<th class="col-1">Cliente</th>'||
                '<th class="col-2">Pedido</th>'||
                '<th class="col-3">Data Pedido</th>'||
                '<th class="col-4">Data Cliente</th>'||
                '<th class="col-5">Dias Atraso</th>'||
                '<th class="col-6">Quantidade</th>'||
                '<th class="col-7">Saldo a Faturar</th>'||
                '<th class="col-8">% a Faturar</th>'||
                '<th class="col-9">Disponível</th>'||
                '<th class="col-10">% Disponível</th>'||
              '</tr></thead>');

    tabela2 = blob_append(null, '');
    tabela3 = blob_append(null, '');
    CONT_LINHAS = 0;
    HTML_GERAL  = blob_append(null, '');

    corpo1 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 11));
    corpo2 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 10));

    OLD_REPRESENTANTE_ID = 0;

    EMAIL  = 'comercial2@delfa.com.br,haroldo@delfa.com.br';
    --EMAIL  = 'anderson@delfa.com.br';

        FOR
    
            select
                REPRESENTANTE_ID,
                REPRESENTANTE_EMAIL,
                REPRESENTANTE,
                CLIENTE,
                PEDIDO,
                formatdate(DATA) as DATA,
                formatdate(DATA_CLIENTE) as DATA_CLIENTE,
                DIAS_ATRASO,
                QUANTIDADE,
                SALDO_A_FATURAR,
                PERCENT,
                DISPONIVEL,
                PERC_DISPONIVEL
            from(
                Select
                    codigo as REPRESENTANTE_ID,
                    EMAIL as REPRESENTANTE_EMAIL,
                    REPRESENTANTE,
                    CLIENTE,
                    PEDIDO,
                    DATA,
                    DATA_CLIENTE,
                    datediff(day,data_cliente, CURRENT_DATE ) DIAS_ATRASO,
                    SUM(QUANTIDADE) QUANTIDADE,
                    SUM(SALDO) SALDO_A_FATURAR,
                    CAST(SUM(SALDO) / SUM(QUANTIDADE) * 100.00 AS NUMERIC(15,2)) AS PERCENT,
                    SUM(DISPONIVEL) DISPONIVEL,
                    CAST(SUM(DISPONIVEL) / SUM(SALDO) * 100.00 AS NUMERIC(15,2)) AS PERC_DISPONIVEL
                
                From (
                Select R.codigo,
                       r.email,
                       R.NomeFantasia||' ('||R.UF||')' REPRESENTANTE,
                       E.NomeFantasia||' ('||E.UF||')' CLIENTE,
                       PI.Pedido, P.Data, P.Data_Cliente,
                       PI.Quantidade, PI.Valor,
                       PI.Qtd_est   Disponivel,
                       S.quantidade Saldo,
                       PI.Valor * S.quantidade VALOR_A_FATURAR 
                
                  From TbPedido_Item PI, TbPedido P, TBProduto PD, TBEmpresa E, tbpedido_item_saldo S, TbEmpresa R
                 Where P.Pedido = PI.Pedido
                   and PI.controle = S.pedido_item_controle
                   and R.Codigo = P.Representante_Codigo
                   and PI.Produto_Codigo = PD.Codigo
                   and P.Cliente_Codigo = E.Codigo
                   and (P.Data_Cliente = CURRENT_DATE - 1 or P.Data_Cliente = CURRENT_DATE - 3)
                   and P.Classificacao = ' '
                   and P.Status = '1'
                   and P.Situacao = 1
                   and PI.Situacao = 1
                )
                GROUP BY 1,2,3,4,5,6,7
            )
    
        INTO
            :REPRESENTANTE_ID,
            :REPRESENTANTE_EMAIL,
            :REPRESENTANTE,
            :CLIENTE,
            :PEDIDO,
            :DATA,
            :DATA_CLIENTE,
            :DIAS_ATRASO,
            :QUANTIDADE,
            :SALDO_A_FATURAR,
            :PERCENT,
            :DISPONIVEL,
            :PERC_DISPONIVEL
        DO
        BEGIN


                if((:OLD_REPRESENTANTE_ID <> :REPRESENTANTE_ID) and :OLD_REPRESENTANTE_ID > 0)then
                begin
                     html       = blob_append(coalesce(:tabela,''),coalesce(:tabela2,''),coalesce(:tabela3,''));
                     HTML_GERAL = blob_append(HTML_GERAL,coalesce(coalesce(:tabela2,''),coalesce(:tabela3,''),''));

                     suspend;
            
                     if((CHAR_LENGTH(:OLD_REPRESENTANTE_EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 ) and CONT_LINHAS > 0) then
                     begin
                        INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO, MODULO_EMAIL)
                        VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2, 5);
                     end

                    :tabela2     = blob_append(null, '');
                    :tabela3     = blob_append(null, '');
                    :CONT_LINHAS = 0;
                end

                :OLD_REPRESENTANTE_ID    = :REPRESENTANTE_ID;
                :OLD_REPRESENTANTE_EMAIL = :REPRESENTANTE_EMAIL;
                
                CONT_LINHAS = CONT_LINHAS + 1;

                if (CHAR_LENGTH (tabela2) < 6000) then
                begin
                    tabela2 =  blob_append(tabela2,'<tr class="--">');
                    tabela2 =  blob_append(tabela2,'<td class="col-String" id="col-String">'      ,coalesce(REPRESENTANTE     ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-String" id="col-String">'      ,coalesce(CLIENTE           ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-String" id="col-String">'      ,coalesce(PEDIDO            ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-String" id="col-String">'      ,coalesce(DATA              ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-String" id="col-String">'      ,coalesce(DATA_CLIENTE      ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(DIAS_ATRASO       ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(QUANTIDADE        ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(SALDO_A_FATURAR   ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(PERCENT           ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(DISPONIVEL        ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(PERC_DISPONIVEL   ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'</tr>');
                end else
                begin
                    tabela3 =  blob_append(tabela3,'<tr class="--">');
                    tabela3 =  blob_append(tabela3,'<td class="col-String" id="col-String">'      ,coalesce(REPRESENTANTE     ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-String" id="col-String">'      ,coalesce(CLIENTE           ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-String" id="col-String">'      ,coalesce(PEDIDO            ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-String" id="col-String">'      ,coalesce(DATA              ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-String" id="col-String">'      ,coalesce(DATA_CLIENTE      ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-numerica" id="col-numerica">'  ,coalesce(DIAS_ATRASO       ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-numerica" id="col-numerica">'  ,coalesce(QUANTIDADE        ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-numerica" id="col-numerica">'  ,coalesce(SALDO_A_FATURAR   ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'<td class="col-numerica" id="col-numerica">'  ,coalesce(PERCENT           ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(DISPONIVEL        ,'') ,'</td>');
                    tabela2 =  blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(PERC_DISPONIVEL   ,'') ,'</td>');
                    tabela3 =  blob_append(tabela3,'</tr>');
                end

         END

         html       = blob_append(coalesce(:tabela,''),coalesce(:tabela2,''),coalesce(:tabela3,''));
         HTML_GERAL = blob_append(coalesce(:tabela,''), HTML_GERAL , coalesce(coalesce(:tabela2,''),coalesce(:tabela3,''),''));
         suspend;

         if((CHAR_LENGTH(:OLD_REPRESENTANTE_EMAIL) > 0) and (CHAR_LENGTH(blob_append(coalesce(:tabela,''),coalesce(:tabela2,''),coalesce(:tabela3,''))) > 0 ) and CONT_LINHAS > 0) then
         begin
            INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO, MODULO_EMAIL)
            VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,blob_append(:corpo1,coalesce(:tabela,''),coalesce(:tabela2,''),coalesce(:tabela3,''),:corpo2), 5);
         end

         if((CHAR_LENGTH(:EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 )) then
         begin
            INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO, MODULO_EMAIL)
            VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,blob_append(:corpo1,coalesce(:HTML_GERAL,''),:corpo2), 5);
         end

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_FRETE_AUTO (
    DATA_1 date = null,
    DATA_2 date = null)
as
declare variable FRETE_VALOR numeric(18,6);
declare variable FRETE_ORIGEM varchar(12);
declare variable FRETE_ORIGEM_ID varchar(108);
declare variable FRETE_TRANSPORTADORA_ID integer;
declare variable TRANSPORTADORA_ID integer;
declare variable TRANSPORTADORA_CNPJ varchar(56);
declare variable TRANSPORTADORA_CNPJ_MASK varchar(1200);
declare variable TRANSPORTADORA_RAZAOSOCIAL varchar(200);
declare variable ID integer;
declare variable NFE integer;
declare variable NFE_SERIE varchar(12);
declare variable DOCUMENTO varchar(4048);
declare variable DATA_EMISSAO date;
declare variable DATA_ENTRADA date;
declare variable ESTABELECIMENTO_ID integer;
declare variable TR_DADOS blob sub_type 1 segment size 80;
declare variable PROCESSADOS blob sub_type 1 segment size 80;
declare variable NAO_PRCESSADOS blob sub_type 1 segment size 80;
BEGIN

    PROCESSADOS    = '';
    NAO_PRCESSADOS = '';

    DATA_1 = IIF(DATA_1 IS NULL,CURRENT_DATE-30,DATA_1);
    DATA_2 = IIF(DATA_2 IS NULL,CURRENT_DATE   ,DATA_2);

    DELETE FROM TBFRETE F WHERE F.ORIGEM <> 'CTE';

    FOR
        SELECT
            X.FRETE_ORIGEM,
            X.FRETE_ORIGEM_ID,
            X.FRETE_TRANSPORTADORA_ID,
            X.TRANSPORTADORA_ID,
            X.TRANSPORTADORA_CNPJ,
            X.TRANSPORTADORA_CNPJ_MASK,
            X.TRANSPORTADORA_RAZAOSOCIAL,
            X.ID,
            X.NFE,
            X.NFE_SERIE,
            X.DOCUMENTO,
            X.DATA_EMISSAO,
            X.DATA_ENTRADA,
            X.ESTABELECIMENTO_ID
    
        FROM (
            SELECT
                DISTINCT
                TRIM('CTE') FRETE_ORIGEM,
                NE.EMPRESA_CODIGO||'|'||NE.NUMERO_NOTAFISCAL||'|'||NE.SERIE FRETE_ORIGEM_ID,
                FT.ID FRETE_TRANSPORTADORA_ID,
                T.TRANSPORTADORA_CODIGO TRANSPORTADORA_ID,
                T.MODALIDADE MODAL,
                NE.EMPRESA_CNPJ TRANSPORTADORA_CNPJ,
                FN_MASK(NE.EMPRESA_CNPJ) TRANSPORTADORA_CNPJ_MASK,
                NE.EMPRESA_RAZAOSOCIAL TRANSPORTADORA_RAZAOSOCIAL,
                NE.CONTROLE ID,
                NE.NUMERO_NOTAFISCAL NFE,
                NE.SERIE NFE_SERIE,
                NE.NUMERO_NOTAFISCAL || '-' || FN_LPAD(NE.SERIE,3,0) DOCUMENTO,
                NE.DATA_EMISSAO,
                NE.DATA_ENTRADA ,
                NE.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID
    
            FROM
                TBNFE NE,
                TBNFE_TRANSPORTADORA T,
                TBFISCAL_ESPECIE FE,
                TBNF_REFERENCIADA NR,
                TBFRETE_TRANSPORTADORA FT
    
            WHERE
                NE.ESPECIE = FE.CODIGO_SPED
            AND FE.DESCRICAO_RESUMIDA = 'CTRC'
            AND NR.ID = NE.CONTROLE         
            AND T.NFE_CONTROLE = NE.CONTROLE
            AND FT.TRANSPORTADORA_ID = T.TRANSPORTADORA_CODIGO
            AND FT.MODAL = T.MODALIDADE
            AND FT.STATUS = 1
            AND NR.NFS_ID > 0
            AND NE.DATA_ENTRADA BETWEEN :DATA_1 AND :DATA_2
            GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
            ) X
            LEFT JOIN TBFRETE F ON F.ORIGEM = X.FRETE_ORIGEM AND F.ORIGEM_ID = X.FRETE_ORIGEM_ID
        WHERE TRUE
        AND F.ORIGEM IS NULL
        ORDER BY DATA_ENTRADA DESC
    INTO
        FRETE_ORIGEM,
        FRETE_ORIGEM_ID,
        FRETE_TRANSPORTADORA_ID,
        TRANSPORTADORA_ID,
        TRANSPORTADORA_CNPJ,
        TRANSPORTADORA_CNPJ_MASK,
        TRANSPORTADORA_RAZAOSOCIAL,
        ID,
        NFE,
        NFE_SERIE,
        DOCUMENTO,
        DATA_EMISSAO,
        DATA_ENTRADA,
        ESTABELECIMENTO_ID
    DO
    BEGIN

        FRETE_VALOR = (SELECT FIRST 1 VALOR_FINAL FROM SPC_FRETE(:FRETE_ORIGEM,:FRETE_ORIGEM_ID,:FRETE_TRANSPORTADORA_ID,:ESTABELECIMENTO_ID,0));

        TR_DADOS = blob_append(
            '<tr>
                <td> ' , FRETE_ORIGEM               , '</td>
                <td> ' , FRETE_ORIGEM_ID            , '</td>
                <td> ' , FRETE_TRANSPORTADORA_ID    , '</td>
                <td> ' , TRANSPORTADORA_ID          , '</td>
                <td> ' , TRANSPORTADORA_CNPJ        , '</td>
                <td> ' , TRANSPORTADORA_CNPJ_MASK   , '</td>
                <td> ' , TRANSPORTADORA_RAZAOSOCIAL , '</td>
                <td> ' , ID                         , '</td>
                <td> ' , NFE                        , '</td>
                <td> ' , NFE_SERIE                  , '</td>
                <td> ' , DOCUMENTO                  , '</td>
                <td> ' , DATA_EMISSAO               , '</td>
                <td> ' , DATA_ENTRADA               , '</td>
                <td> ' , ESTABELECIMENTO_ID         , '</td>
            </tr> ');
           

        IF ( FRETE_VALOR > 0 ) THEN
        BEGIN 
            PROCESSADOS = PROCESSADOS || TR_DADOS;
        END
        ELSE
        BEGIN
            NAO_PRCESSADOS = NAO_PRCESSADOS || TR_DADOS;
        END
--        SUSPEND;
    END


    IF ( PROCESSADOS <> '' ) THEN
    BEGIN

        PROCESSADOS = blob_append(
            '
            <hr/>
                <h1>Notas Processadas</h1>
            <hr/>
            <table>
                <thead>
                    <tr>              
                        <th>FRETE_ORIGEM               </th>
                        <th>FRETE_ORIGEM_ID            </th>
                        <th>FRETE_TRANSPORTADORA_ID    </th>
                        <th>TRANSPORTADORA_ID          </th>
                        <th>TRANSPORTADORA_CNPJ        </th>
                        <th>TRANSPORTADORA_CNPJ_MASK   </th>
                        <th>TRANSPORTADORA_RAZAOSOCIAL </th>
                        <th>ID                         </th>
                        <th>NFE                        </th>
                        <th>NFE_SERIE                  </th>
                        <th>DOCUMENTO                  </th>
                        <th>DATA_EMISSAO               </th>
                        <th>DATA_ENTRADA               </th>
                        <th>ESTABELECIMENTO_ID         </th>
                    </tr>
                </thead>
                <tbody>
                ' , PROCESSADOS , '
                </tbody>
            </table><br/><br/>');

    END
    IF ( NAO_PRCESSADOS <> '' ) THEN
    BEGIN

        NAO_PRCESSADOS = blob_append(
            '<hr/>
                <h1 color="red">Notas Não Processadas</h1>
            <hr/>
            <table>
                <thead>
                    <tr>
                        <th>Peça</th>
                        <th>Dt/Hr Prod.</th>
                    </tr>
                </thead>
                <tbody>
                ' , NAO_PRCESSADOS , '
                </tbody>
            </table>');

    END

    EXECUTE PROCEDURE SPI_EMAIL('suporte@delfa.com.br','Fretes Processados - Período: ' || FN_DATE_TO_STRING(DATA_1) || ' à ' || FN_DATE_TO_STRING(DATA_2),FN_STRING_TO_HTML(PROCESSADOS || NAO_PRCESSADOS), null, 10);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_FRETE_NFE (
    CONTROLE varchar(3000))
as
declare variable FRETE_VALOR numeric(18,6);
declare variable FRETE_ORIGEM varchar(12);
declare variable FRETE_ORIGEM_ID varchar(108);
declare variable FRETE_TRANSPORTADORA_ID integer;
declare variable TRANSPORTADORA_ID integer;
declare variable TRANSPORTADORA_CNPJ varchar(56);
declare variable TRANSPORTADORA_CNPJ_MASK varchar(1200);
declare variable TRANSPORTADORA_RAZAOSOCIAL varchar(200);
declare variable ID integer;
declare variable NFE integer;
declare variable NFE_SERIE varchar(12);
declare variable DOCUMENTO varchar(4048);
declare variable DATA_EMISSAO date;
declare variable DATA_ENTRADA date;
declare variable ESTABELECIMENTO_ID integer;
declare variable TR_DADOS blob sub_type 1 segment size 80;
declare variable PROCESSADOS blob sub_type 1 segment size 80;
declare variable NAO_PRCESSADOS blob sub_type 1 segment size 80;
BEGIN

    PROCESSADOS    = '';
    NAO_PRCESSADOS = '';

    DELETE FROM TBFRETE F WHERE F.ORIGEM <> 'CTE';

    FOR
        SELECT
            X.FRETE_ORIGEM,
            X.FRETE_ORIGEM_ID,
            X.FRETE_TRANSPORTADORA_ID,
            X.TRANSPORTADORA_ID,
            X.TRANSPORTADORA_CNPJ,
            X.TRANSPORTADORA_CNPJ_MASK,
            X.TRANSPORTADORA_RAZAOSOCIAL,
            X.ID,
            X.NFE,
            X.NFE_SERIE,
            X.DOCUMENTO,
            X.DATA_EMISSAO,
            X.DATA_ENTRADA,
            X.ESTABELECIMENTO_ID
    
        FROM (
            SELECT
                DISTINCT
                TRIM('CTE') FRETE_ORIGEM,
                NE.EMPRESA_CODIGO||'|'||NE.NUMERO_NOTAFISCAL||'|'||NE.SERIE FRETE_ORIGEM_ID,
                FT.ID FRETE_TRANSPORTADORA_ID,
                T.TRANSPORTADORA_CODIGO TRANSPORTADORA_ID,
                T.MODALIDADE MODAL,
                NE.EMPRESA_CNPJ TRANSPORTADORA_CNPJ,
                FN_MASK(NE.EMPRESA_CNPJ) TRANSPORTADORA_CNPJ_MASK,
                NE.EMPRESA_RAZAOSOCIAL TRANSPORTADORA_RAZAOSOCIAL,
                NE.CONTROLE ID,
                NE.NUMERO_NOTAFISCAL NFE,
                NE.SERIE NFE_SERIE,
                NE.NUMERO_NOTAFISCAL || '-' || FN_LPAD(NE.SERIE,3,0) DOCUMENTO,
                NE.DATA_EMISSAO,
                NE.DATA_ENTRADA ,
                NE.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID
    
            FROM
                TBNFE NE,
                TBNFE_TRANSPORTADORA T,
                TBFISCAL_ESPECIE FE,
                TBNF_REFERENCIADA NR,
                TBFRETE_TRANSPORTADORA FT
    
            WHERE
                NE.ESPECIE = FE.CODIGO_SPED
            AND FE.DESCRICAO_RESUMIDA = 'CTRC'
            AND NR.ID = NE.CONTROLE      
            AND T.NFE_CONTROLE = NE.CONTROLE
            AND FT.TRANSPORTADORA_ID = T.TRANSPORTADORA_CODIGO
            AND FT.MODAL = T.MODALIDADE
            AND NR.NFS_ID > 0
            AND NE.CONTROLE IN (SELECT OSPLIT FROM SPLIT(:CONTROLE,','))
            GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
            ) X
            LEFT JOIN TBFRETE F ON F.ORIGEM = X.FRETE_ORIGEM AND F.ORIGEM_ID = X.FRETE_ORIGEM_ID
        WHERE TRUE
        AND F.ORIGEM IS NULL
        ORDER BY DATA_ENTRADA DESC
    INTO
        FRETE_ORIGEM,
        FRETE_ORIGEM_ID,
        FRETE_TRANSPORTADORA_ID,
        TRANSPORTADORA_ID,
        TRANSPORTADORA_CNPJ,
        TRANSPORTADORA_CNPJ_MASK,
        TRANSPORTADORA_RAZAOSOCIAL,
        ID,
        NFE,
        NFE_SERIE,
        DOCUMENTO,
        DATA_EMISSAO,
        DATA_ENTRADA,
        ESTABELECIMENTO_ID
    DO
    BEGIN

        FRETE_VALOR = (SELECT FIRST 1 VALOR_FINAL FROM SPC_FRETE(:FRETE_ORIGEM,:FRETE_ORIGEM_ID,:TRANSPORTADORA_ID,:ESTABELECIMENTO_ID,0));

        TR_DADOS = blob_append(
            '
            <tr>              
                <td> ' , FRETE_ORIGEM               , '</td>
                <td> ' , FRETE_ORIGEM_ID            , '</td>
                <td> ' , FRETE_TRANSPORTADORA_ID    , '</td>
                <td> ' , TRANSPORTADORA_ID          , '</td>
                <td> ' , TRANSPORTADORA_CNPJ        , '</td>
                <td> ' , TRANSPORTADORA_CNPJ_MASK   , '</td>
                <td> ' , TRANSPORTADORA_RAZAOSOCIAL , '</td>
                <td> ' , ID                         , '</td>
                <td> ' , NFE                        , '</td>
                <td> ' , NFE_SERIE                  , '</td>
                <td> ' , DOCUMENTO                  , '</td>
                <td> ' , DATA_EMISSAO               , '</td>
                <td> ' , DATA_ENTRADA               , '</td>
                <td> ' , ESTABELECIMENTO_ID         , '</td>
            </tr> ');                               
           

        IF ( FRETE_VALOR > 0 ) THEN
        BEGIN 
            PROCESSADOS = PROCESSADOS || TR_DADOS;
        END
        ELSE
        BEGIN
            NAO_PRCESSADOS = NAO_PRCESSADOS || TR_DADOS;
        END
--        SUSPEND;
    END


    IF ( PROCESSADOS <> '' ) THEN
    BEGIN

        PROCESSADOS = blob_append(
            '
            <hr/>
                <h1>Notas Processadas</h1>
            <hr/>
            <table>
                <thead>
                    <tr>              
                        <th>FRETE_ORIGEM               </th>
                        <th>FRETE_ORIGEM_ID            </th>
                        <th>FRETE_TRANSPORTADORA_ID    </th>
                        <th>TRANSPORTADORA_ID          </th>
                        <th>TRANSPORTADORA_CNPJ        </th>
                        <th>TRANSPORTADORA_CNPJ_MASK   </th>
                        <th>TRANSPORTADORA_RAZAOSOCIAL </th>
                        <th>ID                         </th>
                        <th>NFE                        </th>
                        <th>NFE_SERIE                  </th>
                        <th>DOCUMENTO                  </th>
                        <th>DATA_EMISSAO               </th>
                        <th>DATA_ENTRADA               </th>
                        <th>ESTABELECIMENTO_ID         </th>
                    </tr>
                </thead>
                <tbody>
                ' , PROCESSADOS , '
                </tbody>
            </table><br/><br/>');

    END
    IF ( NAO_PRCESSADOS <> '' ) THEN
    BEGIN

        NAO_PRCESSADOS = blob_append(
            '
            <hr/>
                <h1 color="red">Notas Não Processadas</h1>
            <hr/>
            <table>
                <thead>
                    <tr>
                        <th>Peça</th>
                        <th>Dt/Hr Prod.</th>
                    </tr>
                </thead>
                <tbody>
                ' , NAO_PRCESSADOS , '
                </tbody>
            </table>');

    END

    EXECUTE PROCEDURE SPI_EMAIL('emersoncoelho@delfa.com.br','Fretes Processados - Controles',FN_STRING_TO_HTML(PROCESSADOS || NAO_PRCESSADOS), null, 10);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICA_CAMPANHA
as
declare variable CAMPANHA_ID integer;
declare variable CAMPANHA_DESC varchar(200);
declare variable CAMPANHA_INICIO date;
declare variable CAMPANHA_FINAL date;
declare variable CAMPANHA_QTD_CLIENTES integer;
declare variable USUARIO_ID integer;
declare variable QTD_PENDENTES integer;
declare variable CORPO blob sub_type 1 segment size 80;
BEGIN

    FOR
        SELECT
            T.ID,
            T.DESCRICAO,

            T.DATA_INICIO,
            T.DATA_FINAL,

            COALESCE((SELECT
                COUNT(X.CLIENTE_ID)
            FROM TBCAMPANHA_CLIENTES X
            WHERE X.CAMPANHA_ID = T.ID), 0) AS QTD_CLIENTES
        
        FROM TBCAMPANHA T
        WHERE CURRENT_DATE BETWEEN T.DATA_INICIO AND T.DATA_FINAL

    INTO
        :CAMPANHA_ID,
        :CAMPANHA_DESC,
        :CAMPANHA_INICIO,
        :CAMPANHA_FINAL,
        :CAMPANHA_QTD_CLIENTES

    DO
    BEGIN

        FOR
            SELECT
                A.USUARIO_ID,

                COALESCE((SELECT
                    COUNT(X.CLIENTE_ID)
                FROM TBCAMPANHA_CLIENTES X
                WHERE X.CAMPANHA_ID = A.CAMPANHA_ID
                AND COALESCE((SELECT FIRST 1 X2.ID FROM TBCAMPANHA_CLIENTES_CONTATO X2 WHERE X2.CAMPANHA_CLIENTE_ID = X.ID), 0) = 0), 0) AS QTD_PENDENTES    -- AND X2.USUARIO_ID = A.USUARIO_ID
    
            FROM TBCAMPANHA_NOTIFICACAO A
            WHERE A.CAMPANHA_ID = :CAMPANHA_ID

        INTO
            :USUARIO_ID,
            :QTD_PENDENTES
        DO
        BEGIN
            
            :CORPO = blob_append(null,'');
            
            :CORPO = blob_append(:CORPO, '<p>  </p><br><br>');
            :CORPO = blob_append(:CORPO, '<p> <span style="font-weight: bold;">Periodo: </span> ',FORMATDATE(:CAMPANHA_INICIO),' a ',FORMATDATE(:CAMPANHA_FINAL),' </p>');
            :CORPO = blob_append(:CORPO, '<p> ',:CAMPANHA_QTD_CLIENTES,' Clientes estão registrados nessa campanha </p><br>');
            :CORPO = blob_append(:CORPO, '<p> <strong>',:QTD_PENDENTES,' PENDENTES DE CONTATO!</strong> </p><br>');
            :CORPO = blob_append(:CORPO, '<p> <a href="',FN_PARAMETRO_V2('SISTEMA.URL_SERVER'),'/_12550/Campanha?ID=',:CAMPANHA_ID,'" target="_blank" style="font-weight: bold;">CLIQUE AQUI PARA ABRIR ESSA CAMPANHA!</a> </p><br>');

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

            INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                VALUES (1, :USUARIO_ID, 0, 12550, FN_ELIPSE(COALESCE(:CAMPANHA_DESC, ''), 100), 0, 0, CURRENT_TIMESTAMP, :USUARIO_ID, CURRENT_TIMESTAMP, 0, 'TBCAMPANHA', :CAMPANHA_ID, COALESCE(:CORPO, ''));

        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICA_ESTOQUE_ABASTECIDO (
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    QUANTIDADE numeric(15,4))
as
declare variable VLOCALIZACAO_ID integer;
declare variable VLOCALIZACAO_DESCRICAO varchar(20);
declare variable VPRODUTO_ID integer;
declare variable VPRODUTO_DESCRICAO varchar(100);
declare variable VNOTIFICACAO_USUARIOS varchar(200);
declare variable VUSUARIO_ID integer;
declare variable VUSUARIO_EMAIL varchar(50);
declare variable EMAIL_ID integer;
declare variable HTML_CORPO blob sub_type 1 segment size 80;
declare variable HTML_DADOS blob sub_type 1 segment size 80;
Begin

    For
    select lf.localizacao_id,
           l.descricao localizacao_descricao,
           p.codigo produto_id,
           p.descricao produto_descricao,
           lf.notificacao_usuarios
      from tbproduto p, tblocalizacao_familia lf, tblocalizacao l
     where lf.localizacao_id = :localizacao_id
       and p.familia_codigo = lf.familia_id
       and lf.localizacao_id = l.codigo
       and p.codigo = :produto_id    
       and lf.notifica = '1'
       and char_length(lf.notificacao_usuarios) > 0
    Into :vLOCALIZACAO_ID,:vLOCALIZACAO_DESCRICAO,:vPRODUTO_ID,:vPRODUTO_DESCRICAO,:vNOTIFICACAO_USUARIOS
    Do begin

        HTML_DADOS = blob_append(
            '
            <tr>              
                <td> ' , vLOCALIZACAO_ID||' - '||vLOCALIZACAO_DESCRICAO , '</td>
                <td> ' , vPRODUTO_ID|| ' - '||vPRODUTO_DESCRICAO        , '</td>
                <td> ' , CAST(:QUANTIDADE AS NUMERIC(15,2))             , '</td>
            </tr> ');

        HTML_CORPO = blob_append(
       '<style type="text/css">
        .tg  {border-collapse:collapse;border-spacing:0;}
        .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg .tg-0lax{text-align:left;vertical-align:top}
        </style>',
           '<hr/>
                <h1>Notifica Estoque REABASTECIDO</h1>
            <hr/>
            <table class="tg">
                <thead>
                    <tr>              
                        <th class="tg-0lax">LOCALIZA????O </th>
                        <th class="tg-0lax">PRODUTO     </th>
                        <th class="tg-0lax">SALDO       </th>
                    </tr>
                </thead>
                <tbody>
                ' , HTML_DADOS , '
                </tbody>
            </table><br/><br/>');

        For
        Select u.codigo, u.email /*,u.usuario*/
          from split(:vNOTIFICACAO_USUARIOS,','), tbusuario u
         where cast(OSPLIT as integer) = u.codigo
           and char_length(u.email) > 0
        Into :vUSUARIO_ID, :vUSUARIO_EMAIL /*,:vUSUARIO_NOME*/
        Do begin

        EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);

                INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                   VALUES (
                    1,
                    :vUSUARIO_ID,
                    0,
                    0,
                    'Notificação de Estoque REABASTECIDO!',
                    0,
                    0,
                    current_timestamp,
                    0, 
                    current_timestamp,
                    0,
                    '',
                    0,
                    ' <br/>' || 'Loc.'||:vLOCALIZACAO_ID||' Prod.'||:vPRODUTO_DESCRICAO||' SALDO: '||CAST(:QUANTIDADE AS NUMERIC(15,2))||
                    ' <br/><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15060?PRODUTO_ID='||
                    :vPRODUTO_ID||'" target="_blank" >Clique aqui para ver</a><br>Dt/Hr: '|| FN_DATE(current_timestamp));

                INSERT INTO TBEMAIL (
                    ID,
                    EMAIL,
                    USUARIO_ID,
                    ASSUNTO,
                    CORPO,
                    STATUS,
                    DATAHORA,
                    MODULO_EMAIL
                ) VALUES (
                    :EMAIL_ID,
                    :vUSUARIO_EMAIL,
                    0,
                    'Notificação de Estoque REABASTECIDO',
                    FN_STRING_TO_HTML(:HTML_CORPO),
                    0,
                    CURRENT_TIMESTAMP,
                    16
                );

           end

       end

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICA_ESTOQUE_ZERADO (
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer)
as
declare variable VLOCALIZACAO_ID integer;
declare variable VLOCALIZACAO_DESCRICAO varchar(20);
declare variable VPRODUTO_ID integer;
declare variable VPRODUTO_DESCRICAO varchar(100);
declare variable VNOTIFICACAO_USUARIOS varchar(200);
declare variable VUSUARIO_ID integer;
declare variable VUSUARIO_EMAIL varchar(50);
declare variable EMAIL_ID integer;
declare variable HTML_CORPO blob sub_type 1 segment size 80;
declare variable HTML_DADOS blob sub_type 1 segment size 80;
Begin

    For
    select lf.localizacao_id,
           l.descricao localizacao_descricao,
           p.codigo produto_id,
           p.descricao produto_descricao,
           lf.notificacao_usuarios
      from tbproduto p, tblocalizacao_familia lf, tblocalizacao l
     where lf.localizacao_id = :localizacao_id
       and p.familia_codigo = lf.familia_id
       and lf.localizacao_id = l.codigo
       and p.codigo = :produto_id    
       and lf.notifica = '1'
       and char_length(lf.notificacao_usuarios) > 0
    Into :vLOCALIZACAO_ID,:vLOCALIZACAO_DESCRICAO,:vPRODUTO_ID,:vPRODUTO_DESCRICAO,:vNOTIFICACAO_USUARIOS
    Do begin

        HTML_DADOS = blob_append(
            '<tr>
                <td> ' , vLOCALIZACAO_ID||' - '||vLOCALIZACAO_DESCRICAO , '</td>
                <td> ' , vPRODUTO_ID|| ' - '||vPRODUTO_DESCRICAO        , '</td>
            </tr> ');

        HTML_CORPO = blob_append(
       '<style type="text/css">
        .tg  {border-collapse:collapse;border-spacing:0;}
        .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg .tg-0lax{text-align:left;vertical-align:top}
        </style>',
           '<hr/>
                <h1>Notifica Estoque Zerado</h1>
            <hr/>
            <table class="tg">
                <thead>
                    <tr>              
                        <th class="tg-0lax">LOCALIZA????O </th>
                        <th class="tg-0lax">PRODUTO     </th>
                    </tr>
                </thead>
                <tbody>
                ' , HTML_DADOS , '
                </tbody>
            </table><br/><br/>');

        For
        Select u.codigo, u.email /*,u.usuario*/
          from split(:vNOTIFICACAO_USUARIOS,','), tbusuario u
         where cast(OSPLIT as integer) = u.codigo
           and char_length(u.email) > 0
        Into :vUSUARIO_ID, :vUSUARIO_EMAIL /*,:vUSUARIO_NOME*/
        Do begin

        EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);

                INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                   VALUES (
                    1,
                    :vUSUARIO_ID,
                    0,
                    0,
                    'Notificação de Estoque Zerado!',
                    0,
                    0,
                    current_timestamp,
                    0, 
                    current_timestamp,
                    0,
                    '',
                    0,
                    ' <br/>' || 'Loc.'||:vLOCALIZACAO_ID||' Prod.'||:vPRODUTO_DESCRICAO||
                    ' <br/><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15060?PRODUTO_ID='||
                    :vPRODUTO_ID||'" target="_blank" >Clique aqui para ver</a><br>Dt/Hr: '|| FN_DATE(current_timestamp));

                INSERT INTO TBEMAIL (
                    ID,
                    EMAIL,
                    USUARIO_ID,
                    ASSUNTO,
                    CORPO,
                    STATUS,
                    DATAHORA,
                    MODULO_EMAIL
                ) VALUES (
                    :EMAIL_ID,
                    :vUSUARIO_EMAIL,
                    0,
                    'Notificação de Estoque Zerado',
                    FN_STRING_TO_HTML(:HTML_CORPO),
                    0,
                    CURRENT_TIMESTAMP,
                    16
                );

           end

       end

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPUI_CALCULO_MULTA_JUROS (
    PARCELA_CONTROLE integer = 0,
    OPERACAO char(1) = 'A',
    EMAIL varchar(1000) = '')
as
declare variable CONTROLE integer;
declare variable NFS_CONTROLE integer;
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable EMPRESA_CODIGO integer;
declare variable VCLIENTE varchar(100);
declare variable VDOCUMENTO varchar(100);
declare variable VVALOR varchar(100);
declare variable NUMERO_NOTAFISCAL integer;
declare variable PARCELA integer;
declare variable SERIE varchar(3);
declare variable DATA_EMISSAO date;
declare variable DATA_VENCIMENTO date;
declare variable VALOR numeric(18,5);
declare variable VALOR_SALDO numeric(18,5);
declare variable VALOR_JUROS_DIARIO numeric(18,5);
declare variable VALOR_MULTA numeric(18,5);
declare variable OPERACAO_CODIGO integer;
declare variable MOVCONTABIL_ID integer;
declare variable MOVCONTMESTRE_ID integer;
declare variable LANCAMENTO_JUROS_MULTA integer;
declare variable HISTORICO_CONTABIL varchar(200);
declare variable CCUSTO varchar(20);
declare variable CONTA_CONTABIL varchar(20);
declare variable CONTA_DEBITO varchar(20);
declare variable CONTA_CREDITO varchar(20);
declare variable CORPO_EMAIL blob sub_type 0 segment size 80;
declare variable ENVIAR_EMAIL char(1);
BEGIN

   ENVIAR_EMAIL = '0';
   CORPO_EMAIL  = blob_append(null, '');

   FOR
      SELECT
        A.CONTROLE,
        A.NFS_CONTROLE,
        A.ESTABELECIMENTO_CODIGO,
        A.EMPRESA_CODIGO,
        A.NUMERO_NOTAFISCAL,
        A.PARCELA,
        a.SERIE,
        a.DATA_EMISSAO,
        a.valor,
        a.valor_saldo,
        CAST(IIF(coalesce(pag.juros_diario,0.00) > 0,
            datediff(DAY FROM A.data_vencimento TO CURRENT_DATE)*(CAST(coalesce(A.VALOR,0.00) AS DOUBLE PRECISION) * CAST(coalesce(pag.juros_diario,0.00) AS DOUBLE PRECISION)/100.00),
            0.00) AS NUMERIC(15,2)) AS VALOR_JUROS_DIARIO,
        CAST(IIF(coalesce(pag.multa,0.00) > 0,
            (CAST(coalesce(A.VALOR,0.00) AS DOUBLE PRECISION) * CAST(coalesce(pag.multa,0.00) AS DOUBLE PRECISION)/100.00),
            0.00) AS NUMERIC(15,2)) AS VALOR_MULTA,
        COALESCE((SELECT FIRST 1 LANC.CONTROLE
            FROM tbcaixabanco_lancamento_reg LANC
            WHERE LANC.nfs_parcelamento_controle = A.CONTROLE
            AND LANC.nfs_controle = A.nfs_controle
            AND COALESCE(LANC.CALCULO_MULTA_JUROS,0) = 1),0) AS LANCAMENTO_JUROS_MULTA,

        A.DATA_VENCIMENTO,
        COALESCE((SELECT FIRST 1 FN_LPAD(E.CODIGO,5,'0')||' - '||E.RAZAOSOCIAL||'/'||E.UF FROM TBEMPRESA E WHERE E.CODIGO = A.EMPRESA_CODIGO),FN_LPAD(A.EMPRESA_CODIGO,5,'0')||' - CLIENTE NAO IDENTIFICADO') AS CLIENTE

    
        FROM TBNFS_PARCELAMENTO A, TBPAGAMENTO_FORMA PAG, TBCAIXABANCO_LANCAMENTO_REG LANC2
        WHERE A.data_vencimento < CURRENT_DATE
          AND A.valor_saldo     > 0
          AND LANC2.tarifa_adquirente <> '1'
          AND LANC2.registro_mestre = '1'
          AND COALESCE(LANC2.CALCULO_MULTA_JUROS,0) <> 1
          AND LANC2.nfs_parcelamento_controle = A.CONTROLE
          AND LANC2.nfs_controle              = A.nfs_controle
          AND A.PAGAMENTO_FORMA = PAG.CODIGO
          AND LANC2.TIPO = 'D'
          AND (IIF(:PARCELA_CONTROLE > 0,A.CONTROLE = :PARCELA_CONTROLE, TRUE))
          AND (PAG.juros_diario > 0 OR PAG.multa > 0)
          INTO :CONTROLE, :NFS_CONTROLE, :ESTABELECIMENTO_CODIGO, :EMPRESA_CODIGO, :NUMERO_NOTAFISCAL, :PARCELA,
               :SERIE, :DATA_EMISSAO, :VALOR, :VALOR_SALDO, :VALOR_JUROS_DIARIO, :VALOR_MULTA, :LANCAMENTO_JUROS_MULTA,
               :DATA_VENCIMENTO,:vCLIENTE
          DO BEGIN

             IF(:LANCAMENTO_JUROS_MULTA > 0)THEN
             BEGIN

                UPDATE TBCAIXABANCO_LANCAMENTO_REG LANC
                    SET LANC.valor_total = CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2))
                 WHERE LANC.CONTROLE = :LANCAMENTO_JUROS_MULTA
                    AND LANC.CALCULO_MULTA_JUROS = 1;
                
        
                EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(:NFS_CONTROLE,:CONTROLE);

                update tbnfs_parcelamento parc set parc.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
                    THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
                    WHERE B.NFS_CONTROLE = parc.NFS_CONTROLE
                    AND B.TIPO IN ('D','C')
                    AND B.NFS_PARCELAMENTO_CONTROLE = parc.controle),0.00)
                    where  parc.controle     = :CONTROLE
                       and parc.nfs_controle = :NFS_CONTROLE;

                ENVIAR_EMAIL = '1';
                vDOCUMENTO = FN_LPAD(:NUMERO_NOTAFISCAL,6,'0')||' PARC.'||FN_LPAD(:PARCELA,2,'0')||' VENCTO: '||FORMATDATE(:DATA_VENCIMENTO);
                vVALOR = 'R$ '||FN_FORMAT_NUMBER(:VALOR_JUROS_DIARIO + :VALOR_MULTA,2);
                CORPO_EMAIL = blob_append(CORPO_EMAIL,ASCII_CHAR(13),ASCII_CHAR(10),'<br>','(Atualizado) ',:vCLIENTE,' DOC: ',:vDOCUMENTO,' VR.JUROS/MULTA: ',:vVALOR);


             END ELSE
             BEGIN

                 :MOVCONTABIL_ID   = 0;
                 :MOVCONTMESTRE_ID = 0;

                 FOR
                   SELECT FIRST 1
                     F.CODIGO,
                     F.HISTORICO_CONTABIL,
                     CASE
                     WHEN F.TIPO_CREDITO = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     WHEN F.TIPO_CREDITO = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     ELSE F.CONTA_CREDITO
                     END AS CONTA_CREDITO,
                     CASE
                     WHEN F.TIPO_DEBITO = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     WHEN F.TIPO_DEBITO = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = :EMPRESA_CODIGO)
                     ELSE F.CONTA_DEBITO
                     END AS CONTA_DEBITO,
                     F.CCUSTO
                     FROM TBCONTA_RECEBER_OPERACAO F
                     WHERE F.TIPO = 'D'
                     AND F.STATUS = '1'
                     AND F.CODIGO = COALESCE(FN_PARAMETRO('SISTEMA.OPERACAO_CALCULO_MULTA_JUROS'),0)
                     INTO :OPERACAO_CODIGO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :CCUSTO DO
                     BEGIN
                       :CCUSTO = :CCUSTO;
                     END

                INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (
                    CONTROLE, 
                    ESTABELECIMENTO_CODIGO,
                    EMPRESA_CODIGO,
                    NFS_PARCELAMENTO_CONTROLE,
                    OPERACAO_CODIGO,
                    DOCUMENTO_NUMERO,
                    PARCELA,
                    REGISTRO_MESTRE,
                    DATA,
                    VALOR,
                    VALOR_SALDO,
                    VALOR_TOTAL,
                    TIPO,
                    SERIE,
                    NFE_CONTROLE,
                    NFS_CONTROLE,
                    CODORIGEM,
                    CONTA_DEBITO,
                    CONTA_CREDITO,
                    MOVCONTABIL_ID,
                    MOVCONTMESTRE_ID,
                    CALCULO_MULTA_JUROS,
                    HISTORICO,
                    CCUSTO
                    )
                    VALUES
                    (
                    GEN_ID(gtbcaixabanco_registro,1),
                    :ESTABELECIMENTO_CODIGO,
                    :EMPRESA_CODIGO,
                    :CONTROLE,
                    :OPERACAO_CODIGO,
                    :NUMERO_NOTAFISCAL,
                    :PARCELA,
                    '1',
                    CURRENT_DATE,
                    CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2)),
                    CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2)),
                    CAST((:VALOR_JUROS_DIARIO + :VALOR_MULTA) AS NUMERIC(15,2)),
                    'D',
                    :SERIE,
                    0,
                    :NFS_CONTROLE,
                    'CRE',
                    :CONTA_DEBITO,
                    :CONTA_CREDITO,
                    :MOVCONTABIL_ID,
                    :MOVCONTMESTRE_ID,
                    1,
                    :HISTORICO_CONTABIL,
                    :CCUSTO
                    );
        

                vDOCUMENTO = FN_LPAD(:NUMERO_NOTAFISCAL,6,'0')||' PARC.'||FN_LPAD(:PARCELA,2,'0')||' VENCTO: '||FORMATDATE(:DATA_VENCIMENTO);
                vVALOR = 'R$ '||FN_FORMAT_NUMBER(:VALOR_JUROS_DIARIO + :VALOR_MULTA,2);
                CORPO_EMAIL = blob_append(CORPO_EMAIL,ASCII_CHAR(13),ASCII_CHAR(10),'<br>','(Novo) ',:vCLIENTE,' DOC: ',:vDOCUMENTO,' VR.JUROS/MULTA: ',:vVALOR);
        
                ENVIAR_EMAIL = '1';
                EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(:NFS_CONTROLE,:CONTROLE);

                update tbnfs_parcelamento parc set parc.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
                    THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
                    WHERE B.NFS_CONTROLE = parc.NFS_CONTROLE
                    AND B.TIPO IN ('D','C')
                    AND B.NFS_PARCELAMENTO_CONTROLE = parc.controle),0.00)
                    where  parc.controle     = :CONTROLE
                       and parc.nfs_controle = :NFS_CONTROLE;

             END

          END

        IF ((COALESCE(EMAIL,'') <> '') AND (ENVIAR_EMAIL = '1')) THEN
            BEGIN
            EMAIL = LOWER(:EMAIL);
            CORPO_EMAIL = blob_append(COALESCE(FN_PARAMETRO('SISTEMA.GRUPO_EMPRESARIAL'),''),ASCII_CHAR(13),ASCII_CHAR(10),'<br>','CLIENTES COM PARCELAS EM ATRASO COM JUROS CALCULADOS - ',FORMATDATE(CURRENT_DATE),ASCII_CHAR(13),ASCII_CHAR(10),'<br>',CORPO_EMAIL);
            insert into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
            values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :EMAIL, 0, 'GCWeb - PARCELAS EM ATRASO COM JUROS CALCULADOS', :CORPO_EMAIL, 0, Current_TimeStamp, 0);
            END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_CLIENTE_BLOQUEIOS
returns (
    TIPO varchar(100),
    MOTIVO varchar(50),
    REPRESENTANTE_NOMEFANTASIA varchar(100),
    CLIENTE_ID integer,
    RAZAOSOCIAL varchar(50),
    MOTIVO_INATIVACAO varchar(1000))
as
declare variable REPRESENTANTE_ID integer;
declare variable REPRESENTANTE_EMAIL varchar(200);
declare variable BLOQUEIO_DIAS_ATRASO_PED smallint;
declare variable BLOQUEIO_DIAS_ATRASO_NF smallint;
declare variable BLOQUEIO_DIAS_SEMMOV smallint;
declare variable BLOQUEIA_PEDIDO varchar(1);
declare variable BLOQUEIA_NOTAFISCAL varchar(1);
declare variable INATIVA_DIAS_SEMMOV smallint;
declare variable MOV_DATABASE integer;
declare variable DIASATRASO integer;
declare variable NFS integer;
declare variable NFE integer;
declare variable PED integer;
declare variable AMOVFAT varchar(100);
declare variable AMOVPED varchar(100);
declare variable MOVFAT integer;
declare variable MOVPED integer;
declare variable DMOVFAT date;
declare variable DMOVPED date;
declare variable CHQ integer;
declare variable CHQPEND integer;
declare variable EMAILS varchar(500);
declare variable REPRES_EMAIL_ID integer;
declare variable REPRES_EMAIL varchar(500);
declare variable CORPO_EMAIL1 blob sub_type 0 segment size 80;
declare variable CORPO_EMAIL2 blob sub_type 0 segment size 80;
declare variable ENVIA_EMAIL1 char(1);
declare variable ENVIA_EMAIL2 char(1);
declare variable VAR varchar(100);
BEGIN

  REPRES_EMAIL_ID = 0;
  CORPO_EMAIL1 = blob_append(null, '');
  CORPO_EMAIL2 = blob_append(null, '');
  Envia_Email1 = '0';
  Envia_Email2 = '0';
  REPRES_EMAIL = '';

  Emails = Coalesce((SELECT First 1 Valor_Ext FROM TBCONTROLE_N WHERE ID = 183),'');
  Emails = Replace(Emails,'#REP;','');

   INSERT INTO TBHISTORICO (
   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
  'TBCLIENTE_BLOQUEIO', 0,
  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
   'PROCEDIMENTO PARA BLOQUEIO DE CLIENTES EXECUTADO!');

        FOR SELECT DISTINCT
               C.CODIGO CLIENTE_ID,
               C.RAZAOSOCIAL,
               COALESCE(C.REPRESENTANTE_CODIGO,0),
              (SELECT FIRST 1 R.NOMEFANTASIA||'/'||R.UF FROM TBEMPRESA R WHERE R.CODIGO = C.REPRESENTANTE_CODIGO),
              (SELECT FIRST 1 R.EMAIL FROM TBEMPRESA R WHERE R.CODIGO = C.REPRESENTANTE_CODIGO),
               C.BLOQUEIO_DIAS_ATRASO,
               C.BLOQUEIO_DIAS_ATRASO_NF,
               C.BLOQUEIO_DIAS_SEMMOV,
               C.BLOQUEIA_PEDIDO,
               C.BLOQUEIA_NOTAFISCAL,
               C.INATIVA_DIAS_SEMMOV,
               COALESCE(CURRENT_DATE - COALESCE(E.DATA_ATUALIZACAO,E.DATA),99999) MOV_DATABASE
          FROM TBCLIENTE C, TBEMPRESA E
         WHERE  C.CODIGO = E.CODIGO
           AND  C.REPRESENTANTE_CODIGO > 0
           AND  C.STATUS = '1' -- AND C.GRUPO <> '1'
           AND  E.HABILITA_CLIENTE = '1'
           AND  E.HABILITA_REPRESENTANTE = '0'
           AND((C.INATIVA_DIAS_SEMMOV     > 0) OR
              ((C.BLOQUEIO_DIAS_SEMMOV    > 0  OR
                C.BLOQUEIO_DIAS_ATRASO    > 0  OR
                C.BLOQUEIO_DIAS_ATRASO_NF > 0) AND
               (COALESCE(C.BLOQUEIA_PEDIDO,'0') = '0' OR
                COALESCE(C.BLOQUEIA_NOTAFISCAL,'0') = '0') ))

        ORDER BY 4,5,2
        INTO :CLIENTE_ID, :RAZAOSOCIAL, :REPRESENTANTE_ID,
             :REPRESENTANTE_NOMEFANTASIA,
             :REPRESENTANTE_EMAIL, :BLOQUEIO_DIAS_ATRASO_PED, :BLOQUEIO_DIAS_ATRASO_NF,
             :BLOQUEIO_DIAS_SEMMOV, :BLOQUEIA_PEDIDO, :BLOQUEIA_NOTAFISCAL, :INATIVA_DIAS_SEMMOV,
             :MOV_DATABASE 
        DO
        Begin

        if (:REPRES_EMAIL_ID > 0 AND :REPRES_EMAIL_ID <> :REPRESENTANTE_ID and :Envia_Email1 = '1') then
            Begin
            if (:REPRES_EMAIL <> '') then
                 Begin
                 CORPO_EMAIL1 = blob_append('STATUS DE CLIENTES ALTERADOS AUTOMATICAMENTE:',ASCII_CHAR(13),ASCII_CHAR(10),'<br>',CORPO_EMAIL1);
                 Insert into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
                 values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :REPRES_EMAIL, 0, 'GCWeb - STATUS DE CLIENTES ALTERADOS', :CORPO_EMAIL1, 0, Current_TimeStamp, 5);
                 End
            CORPO_EMAIL1 = '';
            Envia_Email1 = '0';
            End

              DIASATRASO = COALESCE((SELECT FIRST 1 CURRENT_DATE - MIN(FN_DIA_UTIL(A.DATA_VENCIMENTO))
                                       From TbNfs_Parcelamento A, TbPagamento_forma F
                                      WHERE A.PAGAMENTO_FORMA = F.CODIGO
                                        AND A.EMPRESA_CODIGO = :CLIENTE_ID
                                        AND A.SITUACAO_NF = 2
                                        AND A.VALOR_SALDO > 0
                                        AND A.DATA_VENCIMENTO <= CURRENT_DATE
                                        AND F.UTILIZA_LIMITE_CREDITO = 1
                                        AND F.NFE_TIPPAG <> '02' -- DESCONSIDERA PARCELAS DE CHEQUES
                                        ),999999);
/*
              OUTRASPARCELAS = Coalesce((Select First 1 Current_Date - Min(A.Data_Vencimento)
                                       From TbNfs_Parcelamento A, TbPagamento_forma F
                                      Where A.Pagamento_forma = F.Codigo
                                        and A.Empresa_Codigo = :CLIENTE_ID
                                        and A.Situacao = '1'
                                        and A.Aceite = 'S'
                                        and A.Valor_Saldo > 0
                                        and A.Data_Vencimento <= Current_Date
                                        and ((COALESCE(F.Utiliza_Limite_Credito,0) = 0) or (F.NFE_TIPPAG = '02'))
                                        ),999999);
*/

--              MOVFAT = Coalesce((SELECT FIRST 1 Current_Date - MAX(B.DATA)
--                                   FROM TBCAIXABANCO_LANCAMENTO_REG B
--                                  WHERE B.Empresa_Codigo = :CLIENTE_ID),99999);

              aMOVFAT =  COALESCE((
                                   SELECT Cast(CURRENT_DATE - MAX(DATA) as Integer)||'|'||MAX(DATA)
                                    FROM (
                                          SELECT MAX(P.DATA_EMISSAO) DATA FROM TBNFS P
                                           WHERE P.EMPRESA_CODIGO = :CLIENTE_ID
                                             AND P.SITUACAO = 2
                                           UNION ALL
                                          SELECT MAX(PR.DATA_EMISSAO) DATA FROM TBPDV_CFE PR
                                           WHERE PR.CLIENTE_ID = :CLIENTE_ID
                                             AND PR.SITUACAO = 2)
                                   ),'99999|2000-01-01');
              MOVFAT  = CAST(FN_ARRAY(aMOVFAT,1,'|') AS INTEGER);
              dMOVFAT = CAST(FN_ARRAY(aMOVFAT,2,'|') AS DATE);

              aMOVPED =  COALESCE((
                                   SELECT Cast(CURRENT_DATE - MAX(DATA) as Integer)||'|'||MAX(DATA)
                                    FROM (
                                          SELECT MAX(P.DATA) DATA FROM TBPEDIDO P
                                           WHERE P.CLIENTE_CODIGO = :CLIENTE_ID
                                           UNION ALL
                                          SELECT MAX(PR.DATA) DATA FROM TBPDV_CONFERENCIA PR
                                           WHERE PR.CLIENTE_ID = :CLIENTE_ID)
                                   ),'99999|2000-01-01');
              MOVPED  = CAST(FN_ARRAY(aMOVPED,1,'|') AS INTEGER);
              dMOVPED = CAST(FN_ARRAY(aMOVPED,2,'|') AS DATE);

              CHQ = Coalesce((SELECT FIRST 1 B.ID
                                FROM TBCHEQUE B
                               WHERE B.EMPRESA_ID = :CLIENTE_ID
                                 AND B.SITUACAO IN ('2','5')
                              ),0);

              CHQPEND = Coalesce((SELECT FIRST 1 B.ID
                                    FROM TBCHEQUE B
                                   WHERE B.EMPRESA_ID = :CLIENTE_ID
                                     AND B.SITUACAO IN ('0','3','2','5')
                                      ),0);

              /* VERIFICA SE CLIENTE TEM PEDIDO/PREPEDIDO EM ABERTO */
              PED = Coalesce((SELECT First 1 PEDIDO FROM
                             (
                              Select First 1 A.Pedido
                                From TbPedido A, TbPedido_Item B
                               Where A.Cliente_Codigo = :CLIENTE_ID
                                 and A.Pedido = B.Pedido
                                 and A.Situacao = 1
                                 and A.Status = '1'
                                 and B.Situacao = 1

                               Union all

                              Select First 1 A.ID AS PEDIDO
                                FROM TBPDV_CONFERENCIA A, TBPDV_CONFERENCIA_ITEM I
                               WHERE A.ID = I.PDV_CONFERENCIA_ID
                                 AND A.CLIENTE_ID = :CLIENTE_ID
                                 AND I.SITUACAO = 0
                             )
                             ),0);


              --Inativacao de Cliente
              if (:INATIVA_DIAS_SEMMOV > 0 AND :DIASATRASO = 999999 /* AND :OUTRASPARCELAS = 999999 */ ) then
                  Begin

                  if ( ((:MOV_DATABASE < :MOVFAT and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) or
                        (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :INATIVA_DIAS_SEMMOV))   AND
                       ((:MOV_DATABASE < :MOVPED and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) or
                        (:MOV_DATABASE >= :MOVPED and :MOVPED > :INATIVA_DIAS_SEMMOV)) ) Then
                      Begin

                      NFS = COALESCE((SELECT FIRST 1 A.CONTROLE FROM TBNFS_PARCELAMENTO A WHERE A.EMPRESA_CODIGO = :CLIENTE_ID
                                         AND A.SITUACAO = '1' AND A.ACEITE = 'S' AND A.VALOR_SALDO > 0),0);
                      NFE = COALESCE((SELECT FIRST 1 A.CONTROLE FROM TBNFE_PARCELAMENTO A WHERE A.EMPRESA_CODIGO = :CLIENTE_ID
                                         AND A.SITUACAO = '1' AND A.ACEITE = 'S' AND A.VALOR_SALDO > 0),0);

                      IF (:NFS = 0 AND :NFE = 0 AND :PED = 0 AND :CHQPEND = 0) THEN
                           BEGIN

                          --   var =
                          --   ' a '||:MOV_DATABASE ||'<'||  :MOVFAT ||';'|| :MOV_DATABASE ||'>'||:INATIVA_DIAS_SEMMOV||
                          --   ' b '||:MOV_DATABASE ||'>='|| :MOVFAT ||';'|| :MOVFAT       ||'>'||:INATIVA_DIAS_SEMMOV||
                          --   ' c '||:MOV_DATABASE ||'<'||  :MOVPED ||';'|| :MOV_DATABASE ||'>'||:INATIVA_DIAS_SEMMOV||
                          --   ' d '||:MOV_DATABASE ||'>='|| :MOVPED ||';'|| :MOVPED       ||'>'||:INATIVA_DIAS_SEMMOV;

                          -- GRAVA HISTORICO NO CAD DE CLIENTE
                             if (:MOV_DATABASE  < :MOVPED and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) then
                                  Begin
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDOS/PRE-PEDIDOS! ULT.PED/PRE-PED: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDOS/PRE-PEDIDOS';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVPED and :MOVPED > :INATIVA_DIAS_SEMMOV) Then
                                  BEGIN
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDOS/PRE-PEDIDOS! ULT.PED/PRE-PED: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDOS/PRE-PEDIDOS';
                                  END ELSE

                             if (:MOV_DATABASE  < :MOVFAT and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) then
                                  Begin
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :INATIVA_DIAS_SEMMOV) Then
                                  BEGIN
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  END

                           --INATIVA CADASTRO
                             UPDATE TBEMPRESA SET STATUS = 0, MOTIVO_INATIVACAO = :MOTIVO_INATIVACAO WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBCLIENTE SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBFORNECEDOR SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBREPRESENTANTE SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBTRANSPORTADORA SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;

                             TIPO = 'INATIVADO';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '|| :REPRESENTANTE_NOMEFANTASIA;
                                    End
        
                                CORPO_EMAIL1 = blob_append(CORPO_EMAIL1,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                CORPO_EMAIL2 = blob_append(CORPO_EMAIL2,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;

                           End
                      End
                  End 

              --Bloqueios do cliente por nao haver pedidos ou faturamento
              if (:BLOQUEIO_DIAS_SEMMOV > 0) then
                  Begin
                  if (
                      ((:MOV_DATABASE <  :MOVFAT and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) or
                       (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :BLOQUEIO_DIAS_SEMMOV      )) AND
                      ((:MOV_DATABASE <  :MOVPED and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) or
                       (:MOV_DATABASE >= :MOVPED and :MOVPED > :BLOQUEIO_DIAS_SEMMOV      ))
                                                                                           )Then
                      Begin

                      if (:BLOQUEIA_PEDIDO = '0' or :BLOQUEIA_NOTAFISCAL = '0') Then -- and :PED = 0) then
                           Begin

                     --    var =
                     --    ' a '||:MOV_DATABASE ||'<'||  :MOVFAT ||';'|| :MOV_DATABASE ||'>'||:BLOQUEIO_DIAS_SEMMOV||
                     --    ' b '||:MOV_DATABASE ||'>='|| :MOVFAT ||';'|| :MOVFAT       ||'>'||:BLOQUEIO_DIAS_SEMMOV||
                     --    ' c '||:MOV_DATABASE ||'<'||  :MOVPED ||';'|| :MOV_DATABASE ||'>'||:BLOQUEIO_DIAS_SEMMOV||
                     --    ' d '||:MOV_DATABASE ||'>='|| :MOVPED ||';'|| :MOVPED       ||'>'||:BLOQUEIO_DIAS_SEMMOV;

                           --Grava Historico no cad de cliente
                             if (:MOV_DATABASE  < :MOVPED and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) then
                                  Begin
                                --  exception "..."  'a.'||MOV_DATABASE ||' < '|| :MOVPED ;
 
                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDO/PREPEDIDO! ULT.PED/PREPEDIDO: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDO/PRE-PEDIDO';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVPED and :MOVPED > :BLOQUEIO_DIAS_SEMMOV) Then
                                  BEGIN
                                 --  exception "..."  'b.'||MOV_DATABASE ||' >= '|| :MOVPED ;

                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDO/PREPEDIDO! ULT.PED/PREPEDIDO: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDO/PRE-PEDIDO';
                                  END ELSE

                             if (:MOV_DATABASE  < :MOVFAT and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) then
                                  Begin
                               --   exception "..."  'c.'||MOV_DATABASE ||' < '|| :MOVFAT;

                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :BLOQUEIO_DIAS_SEMMOV) Then
                                  BEGIN

                               --   exception "..."  'd.'||MOV_DATABASE ||' >= '|| :MOVFAT;

                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  END

                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_NOTAFISCAL = '1',
                             BLOQUEIA_PEDIDO = '1',
                             --Seta motivo do bloqueio = Sem Movimento
                             BLOQUEIO_MOTIVO = 'SEMMOV'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/PED E NF';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '|| :REPRESENTANTE_NOMEFANTASIA;
                                    End
        
                                CORPO_EMAIL1 = blob_append(CORPO_EMAIL1,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0'),' - ',:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                CORPO_EMAIL2 = blob_append(CORPO_EMAIL2,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0'),' - ',:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;

                           End
                      End
                  End 
        










              --Bloqueios do cliente por pendencias financeiras (parcelas em aberto ou cheques devolvidos)
              if (:BLOQUEIO_DIAS_ATRASO_PED > 0 or :BLOQUEIO_DIAS_ATRASO_NF > 0 or CHQ > 0) then
                  Begin
                  if (:DIASATRASO >= BLOQUEIO_DIAS_ATRASO_PED and DIASATRASO < 999999) Then
                      Begin
                      if (:BLOQUEIA_PEDIDO = '0') then
                           Begin
                             MOTIVO_INATIVACAO = 'BLOQ.PARA PEDIDOS AUTOMATICAMENTE POR ATRASO HA '||COALESCE(:DIASATRASO,0)||' DIAS.';
                           --Grava Historico no cad de cliente
                             INSERT INTO TBHISTORICO (
                             TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                            'TBEMPRESA', :CLIENTE_ID,
                            (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                            (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                             :MOTIVO_INATIVACAO);
        
                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_PEDIDO = '1',
                             --Seta motivo do bloqueio = Sem Movimento
                             BLOQUEIO_MOTIVO = 'ATRASO'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/PED';
                             MOTIVO = 'INADIMPLENCIA: '||:DIASATRASO||' DIAS DE ATRASO)' ;
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '|| :REPRESENTANTE_NOMEFANTASIA;
                                    End

                                CORPO_EMAIL1 = CORPO_EMAIL1||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' - '||:MOTIVO_INATIVACAO;
                                CORPO_EMAIL2 = CORPO_EMAIL2||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' - '||:MOTIVO_INATIVACAO;
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;
                           End
                      End

                  if (:DIASATRASO >= BLOQUEIO_DIAS_ATRASO_NF and DIASATRASO < 999999) Then
                      Begin
                      if (:BLOQUEIA_NOTAFISCAL = '0') then
                           Begin
                             MOTIVO_INATIVACAO = 'BLOQ.PARA NF AUTOMATICAMENTE POR ATRASO HA '||COALESCE(:DIASATRASO,0)||' DIAS.';
                           --Grava Historico no cad de cliente
                             INSERT INTO TBHISTORICO (
                             TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                            'TBEMPRESA', :CLIENTE_ID,
                            (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                            (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                             :MOTIVO_INATIVACAO);
        
                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_NOTAFISCAL = '1',
                             --Seta motivo do bloqueio = Sem Movimento
                             BLOQUEIO_MOTIVO = 'ATRASO'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/NF';
                             MOTIVO = 'INADIMPLENCIA: '||:DIASATRASO||' DIAS DE ATRASO)';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '||:REPRESENTANTE_NOMEFANTASIA;
                                    End

                                CORPO_EMAIL1 = CORPO_EMAIL1||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' - '||:MOTIVO_INATIVACAO;
                                CORPO_EMAIL2 = CORPO_EMAIL2||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' - '||:MOTIVO_INATIVACAO;
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;
                           End
                      End

                  if (:CHQ > 0) Then
                      Begin
                      if (:BLOQUEIA_NOTAFISCAL = '0' or :BLOQUEIA_PEDIDO = '0') then
                           Begin
                             MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE POR MOTIVO DE CHEQUE DEVOLVIDO.';
                           --Grava Historico no cad de cliente
                             INSERT INTO TBHISTORICO (
                             TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                            'TBEMPRESA', :CLIENTE_ID,
                            (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                            (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                             :MOTIVO_INATIVACAO);
        
                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_NOTAFISCAL = '1',
                             BLOQUEIA_PEDIDO = '1', 
                             BLOQUEIO_MOTIVO = 'CHEQUE DEVOLVIDO'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/NF E PEDIDO';
                             MOTIVO = 'CHEQUE DEVOLVIDO';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '||:REPRESENTANTE_NOMEFANTASIA;
                                    End

                                CORPO_EMAIL1 = CORPO_EMAIL1||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' - '||:MOTIVO_INATIVACAO;
                                CORPO_EMAIL2 = CORPO_EMAIL2||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' - '||:MOTIVO_INATIVACAO;
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;
                           End
                      End

                  End

        REPRES_EMAIL = :REPRESENTANTE_EMAIL;
        End

   if (:Envia_Email1 = '1' and :REPRES_EMAIL <> '') then
        Begin
        CORPO_EMAIL1 = COALESCE(FN_PARAMETRO('SISTEMA.GRUPO_EMPRESARIAL'),'')||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||'STATUS DE CLIENTES ALTERADOS AUTOMATICAMENTE:'||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||CORPO_EMAIL1;
        insert into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
        values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :REPRES_EMAIL, 0, 'GCWeb - STATUS DE CLIENTES ALTERADOS', :CORPO_EMAIL1, 0, Current_TimeStamp, 5);
        End

   if (:Envia_Email2 = '1' and :Emails <> '') then
        Begin
        CORPO_EMAIL2 = COALESCE(FN_PARAMETRO('SISTEMA.GRUPO_EMPRESARIAL'),'')||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||'STATUS DE CLIENTES ALTERADOS AUTOMATICAMENTE:'||CORPO_EMAIL2;
        insert into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
        values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :Emails, 0, 'GCWeb - STATUS DE CLIENTES ALTERADOS', :CORPO_EMAIL2, 0, Current_TimeStamp, 5);
        End
 
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_CLIENTE_BLOQUEIOS
returns (
    TIPO varchar(100),
    MOTIVO varchar(50),
    REPRESENTANTE_NOMEFANTASIA varchar(100),
    CLIENTE_ID integer,
    RAZAOSOCIAL varchar(50),
    MOTIVO_INATIVACAO varchar(1000))
as
declare variable REPRESENTANTE_ID integer;
declare variable REPRESENTANTE_EMAIL varchar(200);
declare variable BLOQUEIO_DIAS_ATRASO_PED smallint;
declare variable BLOQUEIO_DIAS_ATRASO_NF smallint;
declare variable BLOQUEIO_DIAS_SEMMOV smallint;
declare variable BLOQUEIA_PEDIDO varchar(1);
declare variable BLOQUEIA_NOTAFISCAL varchar(1);
declare variable INATIVA_DIAS_SEMMOV smallint;
declare variable MOV_DATABASE integer;
declare variable DIASATRASO integer;
declare variable NFS integer;
declare variable NFE integer;
declare variable PED integer;
declare variable AMOVFAT varchar(100);
declare variable AMOVPED varchar(100);
declare variable MOVFAT integer;
declare variable MOVPED integer;
declare variable DMOVFAT date;
declare variable DMOVPED date;
declare variable CHQ integer;
declare variable CHQPEND integer;
declare variable EMAILS varchar(500);
declare variable REPRES_EMAIL_ID integer;
declare variable REPRES_EMAIL varchar(500);
declare variable CORPO_EMAIL1 blob sub_type 0 segment size 80;
declare variable CORPO_EMAIL2 blob sub_type 0 segment size 80;
declare variable ENVIA_EMAIL1 char(1);
declare variable ENVIA_EMAIL2 char(1);
declare variable VAR varchar(100);
BEGIN

  REPRES_EMAIL_ID = 0;
  CORPO_EMAIL1 = blob_append(null, '');
  CORPO_EMAIL2 = blob_append(null, '');
  Envia_Email1 = '0';
  Envia_Email2 = '0';
  REPRES_EMAIL = '';

  Emails = Coalesce((SELECT First 1 Valor_Ext FROM TBCONTROLE_N WHERE ID = 183),'');
  Emails = Replace(Emails,'#REP;','');

   INSERT INTO TBHISTORICO (
   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
  'TBCLIENTE_BLOQUEIO', 0,
  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
   'PROCEDIMENTO PARA BLOQUEIO DE CLIENTES EXECUTADO!');

        FOR SELECT DISTINCT
               C.CODIGO CLIENTE_ID,
               C.RAZAOSOCIAL,
               COALESCE(C.REPRESENTANTE_CODIGO,0),
              (SELECT FIRST 1 R.NOMEFANTASIA||'/'||R.UF FROM TBEMPRESA R WHERE R.CODIGO = C.REPRESENTANTE_CODIGO),
              (SELECT FIRST 1 R.EMAIL FROM TBEMPRESA R WHERE R.CODIGO = C.REPRESENTANTE_CODIGO),
               C.BLOQUEIO_DIAS_ATRASO,
               C.BLOQUEIO_DIAS_ATRASO_NF,
               C.BLOQUEIO_DIAS_SEMMOV,
               C.BLOQUEIA_PEDIDO,
               C.BLOQUEIA_NOTAFISCAL,
               C.INATIVA_DIAS_SEMMOV,
               COALESCE(CURRENT_DATE - COALESCE(E.DATA_ATUALIZACAO,E.DATA),99999) MOV_DATABASE
          FROM TBCLIENTE C, TBEMPRESA E
         WHERE  C.CODIGO = E.CODIGO
           AND  C.REPRESENTANTE_CODIGO > 0
           AND  C.STATUS = '1' -- AND C.GRUPO <> '1'
           AND  E.HABILITA_CLIENTE = '1'
           AND  E.HABILITA_REPRESENTANTE = '0'
           AND((C.INATIVA_DIAS_SEMMOV     > 0) OR
              ((C.BLOQUEIO_DIAS_SEMMOV    > 0  OR
                C.BLOQUEIO_DIAS_ATRASO    > 0  OR
                C.BLOQUEIO_DIAS_ATRASO_NF > 0) AND
               (COALESCE(C.BLOQUEIA_PEDIDO,'0') = '0' OR
                COALESCE(C.BLOQUEIA_NOTAFISCAL,'0') = '0') ))

        ORDER BY 4,5,2
        INTO :CLIENTE_ID, :RAZAOSOCIAL, :REPRESENTANTE_ID,
             :REPRESENTANTE_NOMEFANTASIA,
             :REPRESENTANTE_EMAIL, :BLOQUEIO_DIAS_ATRASO_PED, :BLOQUEIO_DIAS_ATRASO_NF,
             :BLOQUEIO_DIAS_SEMMOV, :BLOQUEIA_PEDIDO, :BLOQUEIA_NOTAFISCAL, :INATIVA_DIAS_SEMMOV,
             :MOV_DATABASE 
        DO
        Begin

        if (:REPRES_EMAIL_ID > 0 AND :REPRES_EMAIL_ID <> :REPRESENTANTE_ID and :Envia_Email1 = '1') then
            Begin
            if (:REPRES_EMAIL <> '') then
                 Begin
                 CORPO_EMAIL1 = blob_append('STATUS DE CLIENTES ALTERADOS AUTOMATICAMENTE:',ASCII_CHAR(13),ASCII_CHAR(10),'<br>',CORPO_EMAIL1);
                 Insert into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
                 values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :REPRES_EMAIL, 0, 'GCWeb - STATUS DE CLIENTES ALTERADOS', :CORPO_EMAIL1, 0, Current_TimeStamp, 5);
                 End
            CORPO_EMAIL1 = '';
            Envia_Email1 = '0';
            End

              DIASATRASO = COALESCE((SELECT FIRST 1 CURRENT_DATE - MIN(FN_DIA_UTIL(A.DATA_VENCIMENTO))
                                       From TbNfs_Parcelamento A, TbPagamento_forma F
                                      WHERE A.PAGAMENTO_FORMA = F.CODIGO
                                        AND A.EMPRESA_CODIGO = :CLIENTE_ID
                                        AND A.SITUACAO_NF = 2
                                        AND A.VALOR_SALDO > 0
                                        AND A.DATA_VENCIMENTO <= CURRENT_DATE
                                        AND F.UTILIZA_LIMITE_CREDITO = 1
                                        AND F.NFE_TIPPAG <> '02' -- DESCONSIDERA PARCELAS DE CHEQUES
                                        ),999999);
/*
              OUTRASPARCELAS = Coalesce((Select First 1 Current_Date - Min(A.Data_Vencimento)
                                       From TbNfs_Parcelamento A, TbPagamento_forma F
                                      Where A.Pagamento_forma = F.Codigo
                                        and A.Empresa_Codigo = :CLIENTE_ID
                                        and A.Situacao = '1'
                                        and A.Aceite = 'S'
                                        and A.Valor_Saldo > 0
                                        and A.Data_Vencimento <= Current_Date
                                        and ((COALESCE(F.Utiliza_Limite_Credito,0) = 0) or (F.NFE_TIPPAG = '02'))
                                        ),999999);
*/

--              MOVFAT = Coalesce((SELECT FIRST 1 Current_Date - MAX(B.DATA)
--                                   FROM TBCAIXABANCO_LANCAMENTO_REG B
--                                  WHERE B.Empresa_Codigo = :CLIENTE_ID),99999);

              aMOVFAT =  COALESCE((
                                   SELECT Cast(CURRENT_DATE - MAX(DATA) as Integer)||'|'||MAX(DATA)
                                    FROM (
                                          SELECT MAX(P.DATA_EMISSAO) DATA FROM TBNFS P
                                           WHERE P.EMPRESA_CODIGO = :CLIENTE_ID
                                             AND P.SITUACAO = 2
                                           UNION ALL
                                          SELECT MAX(PR.DATA_EMISSAO) DATA FROM TBPDV_CFE PR
                                           WHERE PR.CLIENTE_ID = :CLIENTE_ID
                                             AND PR.SITUACAO = 2)
                                   ),'99999|2000-01-01');
              MOVFAT  = CAST(FN_ARRAY(aMOVFAT,1,'|') AS INTEGER);
              dMOVFAT = CAST(FN_ARRAY(aMOVFAT,2,'|') AS DATE);

              aMOVPED =  COALESCE((
                                   SELECT Cast(CURRENT_DATE - MAX(DATA) as Integer)||'|'||MAX(DATA)
                                    FROM (
                                          SELECT MAX(P.DATA) DATA FROM TBPEDIDO P
                                           WHERE P.CLIENTE_CODIGO = :CLIENTE_ID
                                           UNION ALL
                                          SELECT MAX(PR.DATA) DATA FROM TBPDV_CONFERENCIA PR
                                           WHERE PR.CLIENTE_ID = :CLIENTE_ID)
                                   ),'99999|2000-01-01');
              MOVPED  = CAST(FN_ARRAY(aMOVPED,1,'|') AS INTEGER);
              dMOVPED = CAST(FN_ARRAY(aMOVPED,2,'|') AS DATE);

              CHQ = Coalesce((SELECT FIRST 1 B.ID
                                FROM TBCHEQUE B
                               WHERE B.EMPRESA_ID = :CLIENTE_ID
                                 AND B.SITUACAO IN ('2','5')
                              ),0);

              CHQPEND = Coalesce((SELECT FIRST 1 B.ID
                                    FROM TBCHEQUE B
                                   WHERE B.EMPRESA_ID = :CLIENTE_ID
                                     AND B.SITUACAO IN ('0','3','2','5')
                                      ),0);

              /* VERIFICA SE CLIENTE TEM PEDIDO/PREPEDIDO EM ABERTO */
              PED = Coalesce((SELECT First 1 PEDIDO FROM
                             (
                              Select First 1 A.Pedido
                                From TbPedido A, TbPedido_Item B
                               Where A.Cliente_Codigo = :CLIENTE_ID
                                 and A.Pedido = B.Pedido
                                 and A.Situacao = 1
                                 and A.Status = '1'
                                 and B.Situacao = 1

                               Union all

                              Select First 1 A.ID AS PEDIDO
                                FROM TBPDV_CONFERENCIA A, TBPDV_CONFERENCIA_ITEM I
                               WHERE A.ID = I.PDV_CONFERENCIA_ID
                                 AND A.CLIENTE_ID = :CLIENTE_ID
                                 AND I.SITUACAO = 0
                             )
                             ),0);


              --Inativacao de Cliente
              if (:INATIVA_DIAS_SEMMOV > 0 AND :DIASATRASO = 999999 /* AND :OUTRASPARCELAS = 999999 */ ) then
                  Begin

                  if ( ((:MOV_DATABASE < :MOVFAT and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) or
                        (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :INATIVA_DIAS_SEMMOV))   AND
                       ((:MOV_DATABASE < :MOVPED and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) or
                        (:MOV_DATABASE >= :MOVPED and :MOVPED > :INATIVA_DIAS_SEMMOV)) ) Then
                      Begin

                      NFS = COALESCE((SELECT FIRST 1 A.CONTROLE FROM TBNFS_PARCELAMENTO A WHERE A.EMPRESA_CODIGO = :CLIENTE_ID
                                         AND A.SITUACAO = '1' AND A.ACEITE = 'S' AND A.VALOR_SALDO > 0),0);
                      NFE = COALESCE((SELECT FIRST 1 A.CONTROLE FROM TBNFE_PARCELAMENTO A WHERE A.EMPRESA_CODIGO = :CLIENTE_ID
                                         AND A.SITUACAO = '1' AND A.ACEITE = 'S' AND A.VALOR_SALDO > 0),0);

                      IF (:NFS = 0 AND :NFE = 0 AND :PED = 0 AND :CHQPEND = 0) THEN
                           BEGIN

                          --   var =
                          --   ' a '||:MOV_DATABASE ||'<'||  :MOVFAT ||';'|| :MOV_DATABASE ||'>'||:INATIVA_DIAS_SEMMOV||
                          --   ' b '||:MOV_DATABASE ||'>='|| :MOVFAT ||';'|| :MOVFAT       ||'>'||:INATIVA_DIAS_SEMMOV||
                          --   ' c '||:MOV_DATABASE ||'<'||  :MOVPED ||';'|| :MOV_DATABASE ||'>'||:INATIVA_DIAS_SEMMOV||
                          --   ' d '||:MOV_DATABASE ||'>='|| :MOVPED ||';'|| :MOVPED       ||'>'||:INATIVA_DIAS_SEMMOV;

                          -- GRAVA HISTORICO NO CAD DE CLIENTE
                             if (:MOV_DATABASE  < :MOVPED and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) then
                                  Begin
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDOS/PRE-PEDIDOS! ULT.PED/PRE-PED: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDOS/PRE-PEDIDOS';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVPED and :MOVPED > :INATIVA_DIAS_SEMMOV) Then
                                  BEGIN
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDOS/PRE-PEDIDOS! ULT.PED/PRE-PED: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDOS/PRE-PEDIDOS';
                                  END ELSE

                             if (:MOV_DATABASE  < :MOVFAT and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) then
                                  Begin
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :INATIVA_DIAS_SEMMOV) Then
                                  BEGIN
                                   MOTIVO_INATIVACAO = 'INAT.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  END

                           --INATIVA CADASTRO
                             UPDATE TBEMPRESA SET STATUS = 0, MOTIVO_INATIVACAO = :MOTIVO_INATIVACAO WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBCLIENTE SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBFORNECEDOR SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBREPRESENTANTE SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;
                             UPDATE TBTRANSPORTADORA SET STATUS = 0 WHERE CODIGO = :CLIENTE_ID;

                             TIPO = 'INATIVADO';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '|| :REPRESENTANTE_NOMEFANTASIA;
                                    End
        
                                CORPO_EMAIL1 = blob_append(CORPO_EMAIL1,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                CORPO_EMAIL2 = blob_append(CORPO_EMAIL2,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;

                           End
                      End
                  End 

              --Bloqueios do cliente por nao haver pedidos ou faturamento
              if (:BLOQUEIO_DIAS_SEMMOV > 0) then
                  Begin
                  if (
                      ((:MOV_DATABASE <  :MOVFAT and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) or
                       (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :BLOQUEIO_DIAS_SEMMOV      )) AND
                      ((:MOV_DATABASE <  :MOVPED and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) or
                       (:MOV_DATABASE >= :MOVPED and :MOVPED > :BLOQUEIO_DIAS_SEMMOV      ))
                                                                                           )Then
                      Begin

                      if (:BLOQUEIA_PEDIDO = '0' or :BLOQUEIA_NOTAFISCAL = '0') Then -- and :PED = 0) then
                           Begin

                     --    var =
                     --    ' a '||:MOV_DATABASE ||'<'||  :MOVFAT ||';'|| :MOV_DATABASE ||'>'||:BLOQUEIO_DIAS_SEMMOV||
                     --    ' b '||:MOV_DATABASE ||'>='|| :MOVFAT ||';'|| :MOVFAT       ||'>'||:BLOQUEIO_DIAS_SEMMOV||
                     --    ' c '||:MOV_DATABASE ||'<'||  :MOVPED ||';'|| :MOV_DATABASE ||'>'||:BLOQUEIO_DIAS_SEMMOV||
                     --    ' d '||:MOV_DATABASE ||'>='|| :MOVPED ||';'|| :MOVPED       ||'>'||:BLOQUEIO_DIAS_SEMMOV;

                           --Grava Historico no cad de cliente
                             if (:MOV_DATABASE  < :MOVPED and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) then
                                  Begin
                                --  exception "..."  'a.'||MOV_DATABASE ||' < '|| :MOVPED ;
 
                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDO/PREPEDIDO! ULT.PED/PREPEDIDO: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDO/PRE-PEDIDO';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVPED and :MOVPED > :BLOQUEIO_DIAS_SEMMOV) Then
                                  BEGIN
                                 --  exception "..."  'b.'||MOV_DATABASE ||' >= '|| :MOVPED ;

                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM PEDIDO/PREPEDIDO! ULT.PED/PREPEDIDO: '||FORMATDATE(dMOVPED);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM PEDIDO/PRE-PEDIDO';
                                  END ELSE

                             if (:MOV_DATABASE  < :MOVFAT and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) then
                                  Begin
                               --   exception "..."  'c.'||MOV_DATABASE ||' < '|| :MOVFAT;

                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVFAT and :MOVFAT > :BLOQUEIO_DIAS_SEMMOV) Then
                                  BEGIN

                               --   exception "..."  'd.'||MOV_DATABASE ||' >= '|| :MOVFAT;

                                   MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE APOS '||MOVPED||' DIAS SEM FATURAMENTO! ULT.FATURAMENTO: '||FORMATDATE(dMOVFAT);
                                   INSERT INTO TBHISTORICO (
                                   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                                  'TBEMPRESA', :CLIENTE_ID,
                                  (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                                  (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                                   :MOTIVO_INATIVACAO);
                                   MOTIVO = 'SEM FATURAMENTO';
                                  END

                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_NOTAFISCAL = '1',
                             BLOQUEIA_PEDIDO = '1',
                             --Seta motivo do bloqueio = Sem Movimento
                             BLOQUEIO_MOTIVO = 'SEMMOV'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/PED E NF';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '|| :REPRESENTANTE_NOMEFANTASIA;
                                    End
        
                                CORPO_EMAIL1 = blob_append(CORPO_EMAIL1,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0'),' - ',:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                CORPO_EMAIL2 = blob_append(CORPO_EMAIL2,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0'),' - ',:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;

                           End
                      End
                  End 
        










              --Bloqueios do cliente por pendencias financeiras (parcelas em aberto ou cheques devolvidos)
              if (:BLOQUEIO_DIAS_ATRASO_PED > 0 or :BLOQUEIO_DIAS_ATRASO_NF > 0 or CHQ > 0) then
                  Begin
                  if (:DIASATRASO >= BLOQUEIO_DIAS_ATRASO_PED and DIASATRASO < 999999) Then
                      Begin
                      if (:BLOQUEIA_PEDIDO = '0') then
                           Begin
                             MOTIVO_INATIVACAO = 'BLOQ.PARA PEDIDOS AUTOMATICAMENTE POR ATRASO HA '||COALESCE(:DIASATRASO,0)||' DIAS.';
                           --Grava Historico no cad de cliente
                             INSERT INTO TBHISTORICO (
                             TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                            'TBEMPRESA', :CLIENTE_ID,
                            (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                            (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                             :MOTIVO_INATIVACAO);
        
                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_PEDIDO = '1',
                             --Seta motivo do bloqueio = Sem Movimento
                             BLOQUEIO_MOTIVO = 'ATRASO'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/PED';
                             MOTIVO = 'INADIMPLENCIA: '||:DIASATRASO||' DIAS DE ATRASO)' ;
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '|| :REPRESENTANTE_NOMEFANTASIA;
                                    End

                                CORPO_EMAIL1 = blob_append(CORPO_EMAIL1,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                CORPO_EMAIL2 = blob_append(CORPO_EMAIL2,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;
                           End
                      End

                  if (:DIASATRASO >= BLOQUEIO_DIAS_ATRASO_NF and DIASATRASO < 999999) Then
                      Begin
                      if (:BLOQUEIA_NOTAFISCAL = '0') then
                           Begin
                             MOTIVO_INATIVACAO = 'BLOQ.PARA NF AUTOMATICAMENTE POR ATRASO HA '||COALESCE(:DIASATRASO,0)||' DIAS.';
                           --Grava Historico no cad de cliente
                             INSERT INTO TBHISTORICO (
                             TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                            'TBEMPRESA', :CLIENTE_ID,
                            (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                            (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                             :MOTIVO_INATIVACAO);
        
                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_NOTAFISCAL = '1',
                             --Seta motivo do bloqueio = Sem Movimento
                             BLOQUEIO_MOTIVO = 'ATRASO'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/NF';
                             MOTIVO = 'INADIMPLENCIA: '||:DIASATRASO||' DIAS DE ATRASO)';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '||:REPRESENTANTE_NOMEFANTASIA;
                                    End

                                CORPO_EMAIL1 = blob_append(CORPO_EMAIL1,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                CORPO_EMAIL2 = blob_append(CORPO_EMAIL2,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;
                           End
                      End

                  if (:CHQ > 0) Then
                      Begin
                      if (:BLOQUEIA_NOTAFISCAL = '0' or :BLOQUEIA_PEDIDO = '0') then
                           Begin
                             MOTIVO_INATIVACAO = 'BLOQ.AUTOMATICAMENTE POR MOTIVO DE CHEQUE DEVOLVIDO.';
                           --Grava Historico no cad de cliente
                             INSERT INTO TBHISTORICO (
                             TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                            'TBEMPRESA', :CLIENTE_ID,
                            (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
                            (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
                             :MOTIVO_INATIVACAO);
        
                             --Bloqueia Cliente (Pedido e Nota Fiscal)
                             UPDATE TbCliente Set
                             BLOQUEIA_NOTAFISCAL = '1',
                             BLOQUEIA_PEDIDO = '1', 
                             BLOQUEIO_MOTIVO = 'CHEQUE DEVOLVIDO'
                             Where Codigo = :Cliente_Id;

                             TIPO = 'BLOQUEADO P/NF E PEDIDO';
                             MOTIVO = 'CHEQUE DEVOLVIDO';
                             Suspend;

                                if (:REPRES_EMAIL_ID <> :REPRESENTANTE_ID) then
                                    Begin
                                    CORPO_EMAIL2 = CORPO_EMAIL2||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                                   'Representante: '||:REPRESENTANTE_NOMEFANTASIA;
                                    End

                                CORPO_EMAIL1 = blob_append(CORPO_EMAIL1,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                CORPO_EMAIL2 = blob_append(CORPO_EMAIL2,ASCII_CHAR(13),ASCII_CHAR(10),'<br>',FN_LPAD(:CLIENTE_ID,5,'0') ,' - ' ,:RAZAOSOCIAL,' - ',:MOTIVO_INATIVACAO);
                                Envia_Email1 = '1';
                                Envia_Email2 = '1';
                                REPRES_EMAIL_ID = :REPRESENTANTE_ID;
                           End
                      End

                  End

        REPRES_EMAIL = :REPRESENTANTE_EMAIL;
        End

   if (:Envia_Email1 = '1' and :REPRES_EMAIL <> '') then
        Begin
        CORPO_EMAIL1 = COALESCE(FN_PARAMETRO('SISTEMA.GRUPO_EMPRESARIAL'),'')||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||'STATUS DE CLIENTES ALTERADOS AUTOMATICAMENTE:'||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||CORPO_EMAIL1;
        insert into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
        values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :REPRES_EMAIL, 0, 'GCWeb - STATUS DE CLIENTES ALTERADOS', :CORPO_EMAIL1, 0, Current_TimeStamp, 5);
        End

   if (:Envia_Email2 = '1' and :Emails <> '') then
        Begin
        CORPO_EMAIL2 = COALESCE(FN_PARAMETRO('SISTEMA.GRUPO_EMPRESARIAL'),'')||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||'STATUS DE CLIENTES ALTERADOS AUTOMATICAMENTE:'||CORPO_EMAIL2;
        insert into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
        values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :Emails, 0, 'GCWeb - STATUS DE CLIENTES ALTERADOS', :CORPO_EMAIL2, 0, Current_TimeStamp, 5);
        End
 
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_EMAIL_PENDENCIA (
    CLIENTE_ID integer)
returns (
    R_EMAIL varchar(300),
    R_ID integer,
    R_DESC varchar(50),
    R_PARCELA varchar(50),
    R_VALOR numeric(15,2),
    R_VENCIMENTO varchar(50),
    R_FLAG smallint,
    EMAIL_GERADO integer,
    CONTENVIOS integer,
    CONTNAOENVIOS integer,
    R_FANTASIA varchar(300),
    HTML blob sub_type 0 segment size 80)
as
declare variable FANTASIA varchar(300);
declare variable EMAIL_OLD varchar(300);
declare variable ID integer;
declare variable PARCELA varchar(50);
declare variable VALOR numeric(15,2);
declare variable CORPO1 varchar(8150);
declare variable CORPO2 varchar(8150);
declare variable TABELA varchar(8150);
declare variable VENCIMENTO timestamp;
declare variable CLIENTE varchar(100);
declare variable IDANTERIOR integer;
declare variable EMAIL varchar(200);
declare variable FLAG integer;
declare variable VERIFICAR integer;
declare variable NF integer;
declare variable PA integer;
declare variable TABELA2 varchar(8150);
declare variable TABELA3 varchar(8150);
BEGIN
    tabela = '';
    corpo1 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 8));
    corpo2 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 9));

    IDANTERIOR = 0;

    CONTENVIOS = 0;
    contnaoenvios = 0;

    VERIFICAR = 0;

    if(cliente_id = 0)then
    begin
        FOR
    
            Select
                a.empresa_codigo
                ,e.nomefantasia
                ,e.razaosocial
                ,e.email_cpa
                ,a.numero_notafiscal||'/'||a.parcela as Parcela
                ,a.valor
                ,cast(a.data_vencimento as date)
                ,a.notificado_vencimento
                ,a.nfs_controle
                ,a.parcela
    
            From TbNfs_Parcelamento A,tbempresa e, tbcliente c
                Where
                    A.Situacao = '1'
                    and A.Aceite = 'S'
                    and A.Valor_Saldo > 0
                    and (iif( EXTRACT(WEEKDAY FROM a.Data_Vencimento) = 0, A.Data_Vencimento + 1,
                         iif( EXTRACT(WEEKDAY FROM a.Data_Vencimento) = 6, A.Data_Vencimento + 2, A.Data_Vencimento))) +c.notificar_dias_atraso <= current_date
            
                    and e.codigo = a.empresa_codigo
                    and c.codigo = a.empresa_codigo
                    and c.notificar_atraso = 1
                    --and a.empresa_codigo = :cliente_id
            
                    order by a.empresa_codigo, a.data_vencimento, a.nfs_controle, a.parcela
    
        INTO :ID,:FANTASIA,:CLIENTE,:EMAIL, :parcela, :valor, :vencimento, :FLAG, :NF,  :PA
        DO
        BEGIN

            if(IDANTERIOR = ID)then
            begin

                if(FLAG = 0)then
                begin
                    VERIFICAR = 1;
                    update TbNfs_Parcelamento a set a.notificado_vencimento = 1 where a.nfs_controle = :NF and a.parcela = :PA;
                end

                r_id = ID;
                r_desc =  CLIENTE;
                R_FANTASIA = FANTASIA;
                r_parcela = parcela;
                r_valor = valor;
                r_vencimento = coalesce(EXTRACT(DAY FROM vencimento)||'/'||EXTRACT(month FROM vencimento)||'/'||EXTRACT(year FROM vencimento),'');
                r_flag = VERIFICAR;
                r_email = email;
                EMAIL_OLD = email;

                if (CHAR_LENGTH (tabela) < 7600) then
                begin
                    tabela = blob_append(tabela,'<tr class="--">');
                    tabela = blob_append(tabela,'<td class="col-String" id="col-String">'      ,coalesce(parcela,'')     ,'</td>');
                    tabela = blob_append(tabela,'<td class="col-numerica" id="col-numerica">'  ,coalesce(valor,0)        ,'</td>');
                    tabela = blob_append(tabela,'<td class="col-numerica" id="col-numerica" >' ,coalesce(EXTRACT(DAY FROM vencimento),'/',EXTRACT(month FROM vencimento),'/'||EXTRACT(year FROM vencimento),''),'</td>');
                    tabela = blob_append(tabela,'<tr>');
                end else
                begin
                    if (CHAR_LENGTH (tabela2) < 7600) then
                    begin
                        tabela2 = blob_append(tabela2,'<tr class="--">');
                        tabela2 = blob_append(tabela2,'<td class="col-String" id="col-String">'      ,coalesce(parcela,'')     ,'</td>');
                        tabela2 = blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(valor,0)        ,'</td>');
                        tabela2 = blob_append(tabela2,'<td class="col-numerica" id="col-numerica" >' ,coalesce(EXTRACT(DAY FROM vencimento),'/',EXTRACT(month FROM vencimento),'/',EXTRACT(year FROM vencimento),''),'</td>');
                        tabela2 = blob_append(tabela2,'<tr>');
                    end else
                    begin
                        tabela3 = blob_append(tabela3,'<tr class="--">');
                        tabela3 = blob_append(tabela3,'<td class="col-String" id="col-String">'      ,coalesce(parcela,'')     ,'</td>');
                        tabela3 = blob_append(tabela3,'<td class="col-numerica" id="col-numerica">'  ,coalesce(valor,0)        ,'</td>');
                        tabela3 = blob_append(tabela3,'<td class="col-numerica" id="col-numerica" >' ,coalesce(EXTRACT(DAY FROM vencimento),'/',EXTRACT(month FROM vencimento),'/',EXTRACT(year FROM vencimento),''),'</td>');
                        tabela3 = blob_append(tabela3,'<tr>');
                    end
                end

                SUSPEND;

            end
            else
            begin

            r_id = ID;
            R_FANTASIA = FANTASIA;
            r_desc =  CLIENTE;
            r_parcela = parcela;
            r_valor = valor;
            r_vencimento = coalesce(EXTRACT(DAY FROM vencimento)||'/'||EXTRACT(month FROM vencimento)||'/'||EXTRACT(year FROM vencimento),'');
            r_flag = 0;
            r_email = email;


                if((CHAR_LENGTH (EMAIL) > 0) and (CHAR_LENGTH (coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 ) and (IDANTERIOR > 0)) then
                begin
                    if(VERIFICAR = 1)then
                    begin

                        INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
                        VALUES (:EMAIL_OLD, 515, 'DELFA : Verificação de Pendências', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2);
        
                        VERIFICAR = 0;

                        CONTENVIOS = CONTENVIOS + 1;

                        HTML = (:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2);

                    end
                end
                else
                begin
                    VERIFICAR = 0;
                    contnaoenvios = contnaoenvios + 1;
                end
            
                tabela = blob_append('<br>',coalesce(:fantasia,''),'<br><br>');
                tabela =  blob_append(tabela,'<table class="tbl"><thead><tr><th class="col-0">NF/Parcela</th><th class="col-1">Valor</th><th class="col-2">Vencimento</th></tr></thead>');
                tabela =  blob_append(tabela,'<tr class="--">');
                tabela =  blob_append(tabela,'<td class="col-String" id="col-String">'      ,coalesce(parcela,'')     ,'</td>');
                tabela =  blob_append(tabela,'<td class="col-numerica" id="col-numerica">'  ,coalesce(valor,0)        ,'</td>');
                tabela =  blob_append(tabela,'<td class="col-numerica" id="col-numerica" >' ,coalesce(EXTRACT(DAY FROM vencimento),'/',EXTRACT(month FROM vencimento),'/',EXTRACT(year FROM vencimento),''),'</td>');
                tabela =  blob_append(tabela,'<tr>');

                SUSPEND;

            end
    
            IDANTERIOR = ID;
    
        END
     end else
     begin
        FOR
    
            Select
                a.empresa_codigo
                ,e.nomefantasia
                ,e.razaosocial
                ,e.email_cpa
                ,a.numero_notafiscal||'/'||a.parcela as Parcela
                ,a.valor
                ,cast(a.data_vencimento as date)
                ,a.notificado_vencimento
                ,a.nfs_controle
                ,a.parcela
    
            From TbNfs_Parcelamento A,tbempresa e, tbcliente c
                Where
                    A.Situacao = '1'
                    and A.Aceite = 'S'
                    and A.Valor_Saldo > 0
                    and (iif( EXTRACT(WEEKDAY FROM a.Data_Vencimento) = 0, A.Data_Vencimento + 1,
                         iif( EXTRACT(WEEKDAY FROM a.Data_Vencimento) = 6, A.Data_Vencimento + 2, A.Data_Vencimento))) +c.notificar_dias_atraso <= current_date
            
                    and e.codigo = a.empresa_codigo
                    and c.codigo = a.empresa_codigo
                    and c.notificar_atraso = 1
                    and a.empresa_codigo = :cliente_id
            
                    order by a.empresa_codigo, a.data_vencimento, a.nfs_controle, a.parcela
    
        INTO :ID,:FANTASIA,:CLIENTE,:EMAIL, :parcela, :valor, :vencimento, :FLAG, :NF,  :PA
        DO
        BEGIN
            
            update TbNfs_Parcelamento a set a.notificado_vencimento = 1 where a.nfs_controle = :NF and a.parcela = :PA;
    
            if((IDANTERIOR = 0) or (IDANTERIOR = ID))then
            begin
                if(FLAG = 0)then
                begin
                    VERIFICAR = 1;
                end

                r_id = ID;
                r_desc =  CLIENTE;
                R_FANTASIA = FANTASIA;
                r_parcela = parcela;
                r_valor = valor;
                r_vencimento = vencimento;
                r_flag = VERIFICAR;
                r_email = email;
                SUSPEND;
    
                if (CHAR_LENGTH (tabela) < 7600) then
                begin
                    tabela =  tabela||'<tr class="--">';
                    tabela =  tabela||'<td class="col-String" id="col-String">'      ||coalesce(parcela,'')     ||'</td>';
                    tabela =  tabela||'<td class="col-numerica" id="col-numerica">'  ||coalesce(valor,0)        ||'</td>';
                    tabela =  tabela||'<td class="col-numerica" id="col-numerica" >' ||coalesce(EXTRACT(DAY FROM vencimento)||'/'||EXTRACT(month FROM vencimento)||'/'||EXTRACT(year FROM vencimento),'')||'</td>';
                    tabela =  tabela||'<tr>';
                end else
                begin
                    if (CHAR_LENGTH (tabela2) < 7600) then
                    begin
                        tabela2 =  tabela2||'<tr class="--">';
                        tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(parcela,'')     ||'</td>';
                        tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(valor,0)        ||'</td>';
                        tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica" >' ||coalesce(EXTRACT(DAY FROM vencimento)||'/'||EXTRACT(month FROM vencimento)||'/'||EXTRACT(year FROM vencimento),'')||'</td>';
                        tabela2 =  tabela2||'<tr>';
                    end else
                    begin
                        tabela3 =  tabela3||'<tr class="--">';
                        tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(parcela,'')     ||'</td>';
                        tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(valor,0)        ||'</td>';
                        tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica" >' ||coalesce(EXTRACT(DAY FROM vencimento)||'/'||EXTRACT(month FROM vencimento)||'/'||EXTRACT(year FROM vencimento),'')||'</td>';
                        tabela3 =  tabela3||'<tr>';
                    end
                end
    
            end
            else
            begin
                EMAIL_GERADO = 0;

                if((CHAR_LENGTH (EMAIL) > 0) and (CHAR_LENGTH (coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 )) then
                begin
                    if(VERIFICAR = 1)then
                    begin

                        INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO,MODULO_EMAIL)
                        VALUES (:EMAIL, 515, 'DELFA : Verificação de Pendências', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2, 8);
        
                        VERIFICAR = 0;
                        EMAIL_GERADO = 1;

                        HTML = (:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2);
                    END
                END
            
                tabela = '<br>'||coalesce(:fantasia,'')||'<br><br>';
                tabela =  tabela||'<table class="tbl"><thead><tr><th class="col-0">NF/Parcela</th><th class="col-1">Valor</th><th class="col-2">Vencimento</th></tr></thead>';
                tabela =  tabela||'<tr class="--">';
                tabela =  tabela||'<td class="col-String" id="col-String">'      ||coalesce(parcela,'')     ||'</td>';
                tabela =  tabela||'<td class="col-numerica" id="col-numerica">'  ||coalesce(valor,0)        ||'</td>';
                tabela =  tabela||'<td class="col-numerica" id="col-numerica" >' ||coalesce(EXTRACT(DAY FROM vencimento)||'/'||EXTRACT(month FROM vencimento)||'/'||EXTRACT(year FROM vencimento),'')||'</td>';
                tabela =  tabela||'<tr>';

            END
    
            IDANTERIOR = ID;
    
        END
     END
            EMAIL_GERADO = 0;

            if (cliente_id > 0)then
            begin
                VERIFICAR = 1;
            end
    
            if((CHAR_LENGTH (EMAIL) > 0) and (CHAR_LENGTH (coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 )) then
            begin
                if(VERIFICAR = 1)then
                begin
            
                    INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO,MODULO_EMAIL)
                    VALUES (:EMAIL, 515, 'DELFA : Verificação de Pendências', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2, 8);
            
                    VERIFICAR = 0;
                    EMAIL_GERADO = 1;
                     
                end
            end

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_EMAIL_PENDENCIA (
    CLIENTE_ID integer)
returns (
    R_EMAIL varchar(300),
    R_ID integer,
    R_DESC varchar(50),
    R_PARCELA varchar(50),
    R_VALOR numeric(15,2),
    R_VENCIMENTO varchar(50),
    R_FLAG smallint,
    EMAIL_GERADO integer,
    CONTENVIOS integer,
    CONTNAOENVIOS integer,
    R_FANTASIA varchar(300),
    HTML blob sub_type 0 segment size 80)
as
declare variable FANTASIA varchar(300);
declare variable EMAIL_OLD varchar(300);
declare variable ID integer;
declare variable PARCELA varchar(50);
declare variable VALOR numeric(15,2);
declare variable CORPO1 varchar(8150);
declare variable CORPO2 varchar(8150);
declare variable TABELA varchar(8150);
declare variable VENCIMENTO timestamp;
declare variable CLIENTE varchar(100);
declare variable IDANTERIOR integer;
declare variable EMAIL varchar(200);
declare variable FLAG integer;
declare variable VERIFICAR integer;
declare variable NF integer;
declare variable PA integer;
declare variable TABELA2 varchar(8150);
declare variable TABELA3 varchar(8150);
BEGIN
    tabela = '';
    corpo1 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 8));
    corpo2 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 9));

    IDANTERIOR = 0;

    CONTENVIOS = 0;
    contnaoenvios = 0;

    VERIFICAR = 0;

    if(cliente_id = 0)then
    begin
        FOR
    
            Select
                a.empresa_codigo
                ,e.nomefantasia
                ,e.razaosocial
                ,e.email_cpa
                ,a.numero_notafiscal||'/'||a.parcela as Parcela
                ,a.valor
                ,cast(a.data_vencimento as date)
                ,a.notificado_vencimento
                ,a.nfs_controle
                ,a.parcela
    
            From TbNfs_Parcelamento A,tbempresa e, tbcliente c
                Where
                    A.Situacao = '1'
                    and A.Aceite = 'S'
                    and A.Valor_Saldo > 0
                    and (iif( EXTRACT(WEEKDAY FROM a.Data_Vencimento) = 0, A.Data_Vencimento + 1,
                         iif( EXTRACT(WEEKDAY FROM a.Data_Vencimento) = 6, A.Data_Vencimento + 2, A.Data_Vencimento))) +c.notificar_dias_atraso <= current_date
            
                    and e.codigo = a.empresa_codigo
                    and c.codigo = a.empresa_codigo
                    and c.notificar_atraso = 1
                    --and a.empresa_codigo = :cliente_id
            
                    order by a.empresa_codigo, a.data_vencimento, a.nfs_controle, a.parcela
    
        INTO :ID,:FANTASIA,:CLIENTE,:EMAIL, :parcela, :valor, :vencimento, :FLAG, :NF,  :PA
        DO
        BEGIN

            if(IDANTERIOR = ID)then
            begin

                if(FLAG = 0)then
                begin
                    VERIFICAR = 1;
                    update TbNfs_Parcelamento a set a.notificado_vencimento = 1 where a.nfs_controle = :NF and a.parcela = :PA;
                end

                r_id = ID;
                r_desc =  CLIENTE;
                R_FANTASIA = FANTASIA;
                r_parcela = parcela;
                r_valor = valor;
                r_vencimento = coalesce(EXTRACT(DAY FROM vencimento)||'/'||EXTRACT(month FROM vencimento)||'/'||EXTRACT(year FROM vencimento),'');
                r_flag = VERIFICAR;
                r_email = email;
                EMAIL_OLD = email;

                if (CHAR_LENGTH (tabela) < 7600) then
                begin
                    tabela = blob_append(tabela,'<tr class="--">');
                    tabela = blob_append(tabela,'<td class="col-String" id="col-String">'      ,coalesce(parcela,'')     ,'</td>');
                    tabela = blob_append(tabela,'<td class="col-numerica" id="col-numerica">'  ,coalesce(valor,0)        ,'</td>');
                    tabela = blob_append(tabela,'<td class="col-numerica" id="col-numerica" >' ,coalesce(EXTRACT(DAY FROM vencimento),'/',EXTRACT(month FROM vencimento),'/'||EXTRACT(year FROM vencimento),''),'</td>');
                    tabela = blob_append(tabela,'<tr>');
                end else
                begin
                    if (CHAR_LENGTH (tabela2) < 7600) then
                    begin
                        tabela2 = blob_append(tabela2,'<tr class="--">');
                        tabela2 = blob_append(tabela2,'<td class="col-String" id="col-String">'      ,coalesce(parcela,'')     ,'</td>');
                        tabela2 = blob_append(tabela2,'<td class="col-numerica" id="col-numerica">'  ,coalesce(valor,0)        ,'</td>');
                        tabela2 = blob_append(tabela2,'<td class="col-numerica" id="col-numerica" >' ,coalesce(EXTRACT(DAY FROM vencimento),'/',EXTRACT(month FROM vencimento),'/',EXTRACT(year FROM vencimento),''),'</td>');
                        tabela2 = blob_append(tabela2,'<tr>');
                    end else
                    begin
                        tabela3 = blob_append(tabela3,'<tr class="--">');
                        tabela3 = blob_append(tabela3,'<td class="col-String" id="col-String">'      ,coalesce(parcela,'')     ,'</td>');
                        tabela3 = blob_append(tabela3,'<td class="col-numerica" id="col-numerica">'  ,coalesce(valor,0)        ,'</td>');
                        tabela3 = blob_append(tabela3,'<td class="col-numerica" id="col-numerica" >' ,coalesce(EXTRACT(DAY FROM vencimento),'/',EXTRACT(month FROM vencimento),'/',EXTRACT(year FROM vencimento),''),'</td>');
                        tabela3 = blob_append(tabela3,'<tr>');
                    end
                end

                SUSPEND;

            end
            else
