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 =  '<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 = '';
    tabela3 = '';
    CONT_LINHAS = 0;
    HTML_GERAL  = '';

    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 = coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'');
                     HTML_GERAL = 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     = '';
                    :tabela3     = '';
                    :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 =  tabela2||'<tr class="--">';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(REPRESENTANTE     ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(CLIENTE           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(PEDIDO            ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(DATA              ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(DATA_CLIENTE      ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DIAS_ATRASO       ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(QUANTIDADE        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(SALDO_A_FATURAR   ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERCENT           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DISPONIVEL        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERC_DISPONIVEL   ,'') ||'</td>';
                    tabela2 =  tabela2||'</tr>';
                end else
                begin
                    tabela3 =  tabela3||'<tr class="--">';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(REPRESENTANTE     ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(CLIENTE           ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(PEDIDO            ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(DATA              ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(DATA_CLIENTE      ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DIAS_ATRASO       ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(QUANTIDADE        ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(SALDO_A_FATURAR   ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERCENT           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DISPONIVEL        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERC_DISPONIVEL   ,'') ||'</td>';
                    tabela3 =  tabela3||'</tr>';
                end

         END

         html       = coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'');
         HTML_GERAL = coalesce(:tabela,'')|| 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

         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,:corpo1||coalesce(:HTML_GERAL,'')||:corpo2, 5);
         end

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_MODELO_VALIDACAO_NOTIF (
    USUARIOS varchar(100),
    TITULO varchar(1000),
    FAMILIA_ID integer)
as
declare variable VMODELO integer;
declare variable MODELO_ID integer;
declare variable MODELO_DESCRICAO varchar(100);
declare variable MODULO varchar(20);
declare variable TABELA varchar(50);
declare variable CAMPO varchar(20);
declare variable CONDICAO_VALIDA varchar(100);
declare variable TABELA_VALIDACAO varchar(50);
declare variable CAMPO_VALIDACAO varchar(50);
declare variable VALOR_VALIDACAO varchar(20);
declare variable VALOR_VALIDACAO_MINIMO varchar(20);
declare variable VALOR_VALIDACAO_MAXIMO varchar(20);
declare variable CONDICAO_INTERNA varchar(1000);
declare variable CONDICAO_EXTERNA varchar(1000);
declare variable VVALOR1 varchar(100);
declare variable VVALOR2 varchar(100);
declare variable VPRODUTO varchar(100);
declare variable MENSAGEM_ERRO varchar(200);
declare variable ERROS integer;
declare variable TOTAL_ERROS integer;
declare variable VPENDENCIAS varchar(1000);
declare variable MENSAGEM blob sub_type 0 segment size 80;
declare variable USUARIO_ID integer;
declare variable EMAIL varchar(1000);
BEGIN

  MENSAGEM = '';
  vModelo  = 0;
  Total_Erros = 0;

  FOR /*select first 200 distinct m.codigo, m.descricao
        from tbmodelo m, tbmodelo_validacao v, tbestoque_saldo_diario a, tbproduto p
       where m.status = '1'
         and m.codigo = v.modelo_id
         and m.familia_codigo = :familia_id
         and v.status = '0'
         and v.notificacao = '1'
         and p.codigo = a.produto_codigo
         and a.saldo > 0
         and p.modelo_codigo = m.codigo
         union    */
      select first 500 m.codigo, m.descricao
        from tbmodelo m, tbmodelo_validacao v
       where m.status = '1'
         and m.codigo = v.modelo_id
         and m.familia_codigo = :familia_id
         and v.status = '0'
         and v.notificacao = '1'
       /*  and m.data >= CURRENT_DATE - 30 */
  INTO :MODELO_ID, :MODELO_DESCRICAO
  DO BEGIN

  Erros = 0;

   FOR
   SELECT --ID,
          MODULO,
          TABELA,
          CAMPO,
          CONDICAO_VALIDA,
          TABELA_VALIDACAO,
          CAMPO_VALIDACAO,
          VALOR_VALIDACAO,
          CONDICAO_INTERNA,
          CONDICAO_EXTERNA,
          COALESCE(VALOR_VALIDACAO_MINIMO,''),
          COALESCE(VALOR_VALIDACAO_MAXIMO,''),
          --OBSERVACAO,
          MENSAGEM_ERRO
     FROM TBCADASTRO_REGRA CR
    WHERE CADASTRO = 'MODELOS'
      AND FAMILIA_ID = :FAMILIA_ID
      AND STATUS = '1'
     INTO --:ID,
          :MODULO,
          :TABELA,
          :CAMPO,
          :CONDICAO_VALIDA,
          :TABELA_VALIDACAO,
          :CAMPO_VALIDACAO,
          :VALOR_VALIDACAO,
          :CONDICAO_INTERNA,
          :CONDICAO_EXTERNA,
          :VALOR_VALIDACAO_MINIMO,
          :VALOR_VALIDACAO_MAXIMO,
          --:OBSERVACAO,
          :MENSAGEM_ERRO
       DO BEGIN

             if (:CAMPO = 'CODIGO') then
                BEGIN
                :CAMPO = :MODELO_ID;
                END

            :VVALOR1 = '0';
            :VVALOR2 = '0';

            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<CAMPO_VALIDACAO>',:CAMPO_VALIDACAO);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<TABELA>',:TABELA);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<CAMPO>',:CAMPO);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<CAMPO_VALIDACAO>',:CAMPO_VALIDACAO);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<VALOR_VALIDACAO>',:VALOR_VALIDACAO);

            EXECUTE STATEMENT :CONDICAO_INTERNA INTO :VVALOR1;

            if (:CONDICAO_VALIDA = 'SQL') then
                Begin

                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<TABELA>',:TABELA);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<TABELA_VALIDACAO>',:TABELA_VALIDACAO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<VALOR_VALIDACAO>',:VALOR_VALIDACAO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<CONDICAO_INTERNA>',:VVALOR1);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<CAMPO>',:CAMPO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<CAMPO_VALIDACAO>',:CAMPO_VALIDACAO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<VALOR_VALIDACAO_MINIMO>',:VALOR_VALIDACAO_MINIMO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<VALOR_VALIDACAO_MAXIMO>',:VALOR_VALIDACAO_MAXIMO);

                EXECUTE STATEMENT :CONDICAO_EXTERNA INTO :VVALOR2,:vPRODUTO;
    
                if (:VVALOR2 = '0') then
                    BEGIN
                    if (vModelo <> Modelo_Id) Then
                        begin
                        MENSAGEM = MENSAGEM ||'<br>';
                        MENSAGEM = MENSAGEM ||FN_REMOVE_ACENTOS('MODELO: '||LPAD(:MODELO_ID,5,'0')||'-'||modelo_descricao);
                        MENSAGEM = MENSAGEM ||'<br>';
                        end

                    vModelo = :Modelo_Id;
                    vPendencias = ' MODULO: '||MODULO||' -> ('||CAMPO_VALIDACAO||') '||:vPRODUTO||' -> '||FN_REMOVE_ACENTOS(MENSAGEM_ERRO);--||'-'||VALOR_VALIDACAO_MINIMO||'-'||VALOR_VALIDACAO_MAXIMO);

                    MENSAGEM = MENSAGEM || vPendencias ||'<br>';
                    erros = erros + 1;
                    Total_Erros = Total_Erros + 1;
                    --Suspend;
                    END

                End else

            if (:CONDICAO_VALIDA = 'VALOR') then
                Begin

                if (POSITION('#'||:VVALOR1||'#',:CONDICAO_EXTERNA) = 0) then
                    BEGIN
                    if (vModelo <> Modelo_Id) Then
                        begin
                        MENSAGEM = MENSAGEM ||'<br>';
                        MENSAGEM = MENSAGEM ||FN_REMOVE_ACENTOS('MODELO: '||LPAD(:MODELO_ID,5,'0')||'-'||modelo_descricao);
                        MENSAGEM = MENSAGEM ||'<br>';
                        end

                    vModelo = :Modelo_Id;
                    vPendencias = FN_REMOVE_ACENTOS(' MODULO: '||MODULO||'  -> '||MENSAGEM_ERRO);--||'-'||VALOR_VALIDACAO_MINIMO||'-'||VALOR_VALIDACAO_MAXIMO);

                    MENSAGEM = MENSAGEM || vPendencias ||'<br>';
                    erros = erros + 1;
                    Total_Erros = Total_Erros + 1;
                    --Suspend;
                    END

                End 

          END

      if (Erros = 0) then
          begin
            in autonomous transaction do
               begin
               Update tbmodelo_validacao set Status = '1' where modelo_id = :Modelo_Id;
               End
          end else
          begin
            vPendencias = FN_REMOVE_ACENTOS(' -----------------------> NR. DE ERROS: '||:ERROS);
            MENSAGEM = MENSAGEM || vPendencias ||'<br>';
          end

      END

  if (Total_Erros > 0) then
      Begin
          For
          Select U.Codigo, Email
          From TbUsuario U
          Where U.Codigo in (select OSPLIT from split(:usuarios,','))
          Into :Usuario_Id, :Email
          Do begin
        
            in autonomous transaction do
               begin
               INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO, MODULO_EMAIL)
               VALUES (:EMAIL, 0, :TITULO, 0, current_timestamp,:MENSAGEM, 18);
                    
               EXECUTE PROCEDURE SPI_NOTIFICAR(CURRENT_TIMESTAMP,:USUARIO_ID,:TITULO, TOTAL_ERROS||' ERROS ENCONTRADOS NO CADASTRO DE MODELOS, AS PENDENCIAS FORAM ENVIADAS POR E-MAIL, FAVOR VERIFICAR!',0,1);
               End

             End
      End
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPC_NOTIFICAR_JUSTIFICATIVA
returns (
    EMAIL_NOTIFICAR varchar(200),
    GP_DESCRICAO varchar(20),
    GP_ID integer,
    TALOES bigint,
    TEMPO bigint,
    EFICIENCIA numeric(18,8))
as
declare variable TITULO varchar(1000);
declare variable CORPO varchar(3000);
begin
  for
    select distinct
        EMAIL_NOTIFICAR,
        GP_DESCRICAO,
        GP_ID,
    
        count(JUSTIFICATIVA_ID) as TALOES,
        avg(tempo) as TEMPO,
        avg(eficiencia) as EFICIENCIA
    FROM(
    
        select
    
            H.email_notificar, G.descricao AS gp_DESCRICAO, u.descricao as up_descricao,
            p.gp_id, p.up_id, p.estacao, p.eficiencia, datediff(hour, p.datahora_finalizado, current_timestamp) AS tempo,
            coalesce((select s.id from tbregistro_parada s where s.subvinculo_id = p.tabela_id and s.status = 119),0) AS JUSTIFICATIVA_ID
    
        from tbprogramacao p, tbbloqueio_producao H, tbgp G, tbup U
        where p.datahora_finalizado >= fn_parametro(563)
        AND (P.eficiencia < 70 OR P.eficiencia > 130)
        AND H.gp_id = P.gp_id
        AND H.up = P.up_id
        AND H.status = 1
        AND G.id = H.gp_id
        AND U.id = H.up
        and p.status = 3
        and p.eficiencia > 0
    
    ) X WHERE JUSTIFICATIVA_ID = 0
    group by 1,2,3
    order by  email_notificar, gp_DESCRICAO

  into
    EMAIL_NOTIFICAR,
    GP_DESCRICAO,
    GP_ID,
    TALOES,
    TEMPO,
    EFICIENCIA
  do begin

    TITULO =  :GP_ID||'-'||GP_DESCRICAO||', HÁ '||:TALOES||' TALÕES PENDENTES DE JUSTIFICATIVA';

    CORPO  = :TITULO||'<br><a class="msg-balao-fechar" href="'||fn_parametro(552)||'/_22020" target="_blank" >Visualizar no GC-Web</a> ';

    INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO, MODULO_EMAIL)
            VALUES (:EMAIL_NOTIFICAR, 0, :TITULO, 0, current_timestamp,:CORPO, 16);

     suspend;
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_EMAIL (
    DESTINATARIO varchar(500),
    ASSUNTO varchar(500),
    CORPO blob sub_type 0 segment size 80,
    NOTIFICAR_USUARIO integer = null,
    MODULO_EMAIL INTEGER = 0)
as
declare variable EMAIL varchar(500);
declare variable USUARIO_ID integer;
declare variable EMAIL_ID integer;
begin

    NOTIFICAR_USUARIO = COALESCE(NOTIFICAR_USUARIO,0);

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

    IF ( NOTIFICAR_USUARIO = 1 ) THEN
    BEGIN
        FOR
            SELECT EMAIL
              FROM SPC_EMAIL_VALIDO(:DESTINATARIO)
             WHERE VALIDO = 1
        INTO
            EMAIL
        DO
        BEGIN
            USUARIO_ID = (SELECT FIRST 1 CODIGO FROM TBUSUARIO U WHERE U.EMAIL = :EMAIL);
    
            IF ( USUARIO_ID > 0 ) 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,
                    'Voce recebeu um novo email do sistema!',
                    0,
                    0,
                    current_timestamp,
                    :USUARIO_ID,
                    current_timestamp,
                    0,
                    '',
                    0,
                    'Assunto: <br/>' || :ASSUNTO ||'<br/><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_11340/'||:EMAIL_ID||'" target="_blank" >Clique aqui para ver</a><br>Dt/Hr: '|| FN_DATE(current_timestamp));
            END
            
        END
    END


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

SET TERM ; ^

COMMENT ON PARAMETER SPI_EMAIL.NOTIFICAR_USUARIO IS
'1 = Sim | 0 = Nao | Default: Nao';

SET TERM ^ ;

CREATE OR ALTER procedure SPC_NOTIFICAR_ERRO_WS (
    ERRO blob sub_type 1 segment size 80,
    TIPO varchar(50))
returns (
    EMAIL varchar(100))
as
declare variable TITULO varchar(1000);
declare variable CORPO varchar(3000);
declare variable LIST_EMAIL varchar(1000);
declare variable DATA_HORA varchar(50);
begin

  list_email = fn_parametro('SISTEMA.EMAIL_ERRO_WS');

  DATA_HORA = formatdatetime(current_timestamp);

  if(char_length(list_email) > 0)then
  begin

      for
        select
            OSPLIT
        from split(:list_email,',')
      into
        EMAIL
      do begin
    
        TITULO = 'WebService - Erro ao integrar '||:TIPO||' em '||:DATA_HORA;
        ERRO   = FN_STRING_TO_HTML(:ERRO);

        in autonomous transaction do
        begin
            execute procedure SPI_EMAIL(:EMAIL, :TITULO, :ERRO, 1, 1);
        end

        suspend;
      end

  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 =
            '
            <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 =
            '
            <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 =
            '
            <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 =
            '
            <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 =
            '
            <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 =
            '
            <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 SP_BAIXA_RESIDUO_REMESSA (
    DATA_INICIO date,
    DATA_FIM date)
returns (
    EMAIL_ENVIADO integer,
    ECORPO blob sub_type 1 segment size 80)
as
declare variable ID_ESTOQUE_RESIDUO integer;
declare variable PRODUTO_CODIGO integer;
declare variable TAMANHO integer;
declare variable REMESSA_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable TALAO_ID integer;
declare variable CONTROLE integer;
declare variable REMESSA varchar(60);
declare variable GP_ID integer;
declare variable SALDO numeric(18,5);
declare variable PRODUCAO numeric(18,5);
declare variable USADO numeric(18,4);
declare variable DATA_PRODUCAO date;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID integer;
declare variable CCUSTO varchar(20);
declare variable CORPO blob sub_type 1 segment size 80;
declare variable EMAIL varchar(300);
begin
    CORPO = '';

    --baixa de residuos de tecido
    for
        select
            39 FAMILIA_ID,
            PERFIL_UP,
            PRODUTO_CODIGO,
            TAMANHO,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            TALAO_ID,
            CONTROLE,
            REMESSA,
            GP_ID,
            SALDO,
            PRODUCAO,
            USADO,
            DATA_PRODUCAO,
            CCUSTO
        from(
        
            select
                u.perfil AS PERFIL_UP,
                P.produto_codigo,
                P.tamanho,
                p.remessa as remessa_id,
                p.remessa_acumulado_controle as remessa_talao_id,
                p.controle as talao_id,
                p.controle,
                R.remessa,
                r.gp_id,
                p.quantidade_saldo as saldo,
                p.quantidade_producao as producao,
                coalesce((select sum(j.quantidade) from tbremessa_consumo_vinculo j where j.remessa_talao_detalhe_id = p.controle),0) as usado,
                p.data_producao,
                U.ccusto
            from tbpedido_item_processado p, tbremessa r, tbremessa_item_processado K, tbup u
            where  p.data_producao between :DATA_INICIO and :DATA_FIM
            and p.situacao = 3
            and r.numero = p.remessa
            and r.web = '1'
            and r.familia_codigo = 39
            and r.componente = '1'
            and p.quantidade_saldo > 0
            AND K.remessa = P.remessa
            AND K.controle = P.remessa_acumulado_controle
            AND U.id = K.up_id
            and coalesce(p.estoque_id_residuo,0) = 0
        
        ) a where producao >  usado
        and (producao - usado) = saldo
        and saldo > 0
    into
        FAMILIA_ID,
        PERFIL_UP,
        PRODUTO_CODIGO,
        TAMANHO,
        REMESSA_ID,
        REMESSA_TALAO_ID,
        TALAO_ID,
        CONTROLE,
        REMESSA,
        GP_ID,
        SALDO,
        PRODUCAO,
        USADO,
        DATA_PRODUCAO,
        CCUSTO
    do begin
        ID_ESTOQUE_RESIDUO = GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1);
        
        update tbpedido_item_processado p set p.estoque_id_residuo = :ID_ESTOQUE_RESIDUO where p.controle = :talao_id;

        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(3,:gp_id,:PERFIL_UP,:FAMILIA_ID,14,'TBREMESSA_CONSUMO',
            3,
            :remessa_talao_id,
            1,
            current_date,
            :produto_codigo,
            :tamanho,
            :saldo,
            'S',
            '1',
            :CCUSTO,
            '(***) SAIDA DE RESIDUO TECIDO.',
            :ID_ESTOQUE_RESIDUO,
            :remessa_id,
            :talao_id,
            'RD'||FN_LPAD(:talao_id,11,0)
        );

        CORPO = CORPO || '<br>';
        CORPO = CORPO || 'Rem.:'||REMESSA||'/'||REMESSA_TALAO_ID||' em '||formatdate(data_producao)||'<br>';
        CORPO = CORPO || 'Pro.:'||produto_codigo||' - '||coalesce((select first 1 k.descricao from tbproduto k where k.codigo = :produto_codigo),'')||', Tam.:'||coalesce(fn_tamanho_produto(produto_codigo,tamanho),'')||', Qtd.:'||coalesce(saldo,0)||'<br>';
    end

    --baixa de residuos de manta
    for
        select
            71 FAMILIA_ID,
            PERFIL_UP,
            PRODUTO_CODIGO,
            TAMANHO,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            TALAO_ID,
            CONTROLE,
            REMESSA,
            GP_ID,
            SALDO,
            PRODUCAO,
            USADO,
            DATA_PRODUCAO,
            CCUSTO
        from(
        
            select
                u.perfil AS PERFIL_UP,
                P.produto_codigo,
                P.tamanho,
                p.remessa as remessa_id,
                p.remessa_acumulado_controle as remessa_talao_id,
                p.controle as talao_id,
                p.controle,
                R.remessa,
                r.gp_id,
                p.quantidade_saldo as saldo,
                p.quantidade_producao as producao,
                coalesce((select sum(j.quantidade) from tbremessa_consumo_vinculo j where j.remessa_talao_detalhe_id = p.controle),0) as usado,
                p.data_producao,
                U.ccusto
            from tbpedido_item_processado p, tbremessa r, tbremessa_item_processado K, tbup u
            where  p.data_producao between :DATA_INICIO and :DATA_FIM
            and p.situacao = 3
            and r.numero = p.remessa
            and r.web = '1'
            and r.familia_codigo = 71
            and r.componente = '1'
            and p.quantidade_saldo > 0
            AND K.remessa = P.remessa
            AND K.controle = P.remessa_acumulado_controle
            AND U.id = K.up_id
            and coalesce(p.estoque_id_residuo,0) = 0
        
        ) a where producao >  usado
        and (producao - usado) = saldo
        and saldo > 0
    into
        FAMILIA_ID,
        PERFIL_UP,
        PRODUTO_CODIGO,
        TAMANHO,
        REMESSA_ID,
        REMESSA_TALAO_ID,
        TALAO_ID,
        CONTROLE,
        REMESSA,
        GP_ID,
        SALDO,
        PRODUCAO,
        USADO,
        DATA_PRODUCAO,
        CCUSTO
    do begin
        ID_ESTOQUE_RESIDUO = GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1);
        
        update tbpedido_item_processado p set p.estoque_id_residuo = :ID_ESTOQUE_RESIDUO where p.controle = :talao_id;

        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(3,:gp_id,:PERFIL_UP,:FAMILIA_ID,14,'TBREMESSA_CONSUMO',
            3,
            :remessa_talao_id,
            1,
            :data_producao,
            :PRODUTO_CODIGO,
            :tamanho,
            :saldo,
            'S',
            '1',
            :CCUSTO,
            '(***) SAIDA DE RESIDUO MANTA.',
            :ID_ESTOQUE_RESIDUO,
            :remessa_id,
            :talao_id,
            'RD'||FN_LPAD(:talao_id,11,0)
        );

        CORPO = CORPO || '<br>';
        CORPO = CORPO || 'Rem.:'||REMESSA||'/'||REMESSA_TALAO_ID||' em '||formatdate(data_producao)||'<br>';
        CORPO = CORPO || 'Pro.:'||produto_codigo||' - '||coalesce((select first 1 k.descricao from tbproduto k where k.codigo = :produto_codigo),'')||', Tam.:'||coalesce(fn_tamanho_produto(produto_codigo,tamanho),'')||', Qtd.:'||saldo||'<br>';

    end

    FOR
        select
            3 FAMILIA_ID,
            'U' PERFIL_UP,
            PRODUTO_CODIGO,
            TAMANHO,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            TALAO_ID,
            CONTROLE,
            REMESSA,
            GP_ID,
            0 SALDO,
            PRODUCAO,
            0 USADO,
            DATA_PRODUCAO,
            '21' AS CCUSTO
        from(
            select
                p.remessa as remessa_id,
                p.remessa_acumulado_controle as remessa_talao_id,
                p.controle as talao_id,
                p.controle,
                r.remessa,
                P.programacao_esteira AS GP_ID,
                p.remessa_acumulado_controle as talao,
                j.descricao as produto,
                p.produto_codigo,
                p.data_producao,
                p.quantidade_producao as PRODUCAO,
                p.tamanho
            from tbremessa r, tbproduto j, tbpedido_item_processado p
            left join tbremessa_consumo_vinculo v on v.remessa_talao_detalhe_id = p.controle
            where p.remessa = r.numero
            and p.data_producao between :DATA_INICIO and :DATA_FIM
            and r.web = '3'
            and j.codigo = p.produto_codigo
            and v.consumo_id is null
        )

    into
        FAMILIA_ID,
        PERFIL_UP,
        PRODUTO_CODIGO,
        TAMANHO,
        REMESSA_ID,
        REMESSA_TALAO_ID,
        TALAO_ID,
        CONTROLE,
        REMESSA,
        GP_ID,
        SALDO,
        PRODUCAO,
        USADO,
        DATA_PRODUCAO,
        CCUSTO
    do begin

        ID_ESTOQUE_RESIDUO = GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1);
        
        update tbpedido_item_processado p set p.estoque_id_residuo = :ID_ESTOQUE_RESIDUO where p.controle = :talao_id;

        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(3,:gp_id,:PERFIL_UP,:FAMILIA_ID,14,'TBREMESSA_CONSUMO',
            3,
            :remessa_talao_id,
            1,
            :data_producao,
            current_date,
            :tamanho,
            :PRODUCAO,
            'S',
            '1',
            :CCUSTO,
            '(***) SAIDA DE RESIDUO BOJO/PLACA.',
            :ID_ESTOQUE_RESIDUO,
            :remessa_id,
            :talao_id,
            'RD'||FN_LPAD(:talao_id,11,0)
        );

        CORPO = CORPO || '<br>';
        CORPO = CORPO || 'Rem.:'||REMESSA||'/'||REMESSA_TALAO_ID||' em '||formatdate(data_producao)||'<br>';
        CORPO = CORPO || 'Pro.:'||produto_codigo||' - '||coalesce((select first 1 k.descricao from tbproduto k where k.codigo = :produto_codigo),'')||', Tam.:'||coalesce(fn_tamanho_produto(produto_codigo,tamanho),'')||', Qtd.:'||saldo||'<br>';
    end

    EMAIL_ENVIADO = 0;
    ECORPO = CORPO;

    IF(char_length(CORPO) > 0)THEN
    BEGIN
        EMAIL = fn_parametro('SISTEMA.EMAIL_BAIXA_RESIDUOS');

        EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'BAIXA DE RESIDUO DE REMESSAS - '||formatdatetime(current_timestamp), :CORPO, 0, 16);

        EMAIL_ENVIADO = 1;
    END

    suspend;

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_ESTOQUE (
    PDV_CFE_ID integer,
    ESTABELECIMENTO_ID integer,
    CLIENTE_ID integer,
    CAIXA_ID integer,
    NUMERO_CFE integer,
    SERIE_CFE varchar(3),
    DATA_EMISSAO date,
    ACAO integer,
    TRAVAR_SE_FALHAR char(1) = '1')
as
declare variable ID integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(200);
declare variable DESC_ESTABELECIMENTO varchar(500);
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,2);
declare variable SALDO numeric(15,2);
declare variable SALDO_HOJE numeric(15,2);
declare variable LOCALIZACAO_ID integer;
declare variable DESC_LOCALIZACAO varchar(500);
declare variable DESC_TAMANHO varchar(500);
declare variable OPERACAO_CODIGO varchar(3);
declare variable ESTOQUE_ID integer;
declare variable SEQUENCIA integer;
declare variable GRADE_CODIGO integer;
declare variable EMAIL varchar(300);
declare variable CORPO varchar(1000);
declare variable TRANSACAO_ID integer;
declare variable CHECK_ESTOQUE integer;
declare variable FLAG_ENVIO_EMAIL integer;
declare variable CONTROLE_ESTOQUE char(1);
BEGIN

    FOR SELECT
            T.ID,
            T.PRODUTO_ID,
            T.PRODUTO_DESCRICAO,
            T.LOCALIZACAO_ID,
            T.OPERACAO_CODIGO,
            T.TAMANHO,
            T.QUANTIDADE,
            T.ESTOQUE_ID,
            T.SEQUENCIA,
            P.GRADE_CODIGO,
            O.CONTROLE_ESTOQUE
        FROM TBPDV_CFE_ITEM T
        INNER JOIN TBPDV_CFE C ON C.ID = T.PDV_CFE_ID
        INNER JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
        INNER JOIN TBOPERACAO O ON O.CODIGO = T.OPERACAO_CODIGO
        WHERE T.PDV_CFE_ID = :PDV_CFE_ID
        AND C.IMPORTACAO = 0
        AND T.ATUALIZA_ESTOQUE = 1
        INTO :ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :LOCALIZACAO_ID,
            :OPERACAO_CODIGO, :TAMANHO, :QUANTIDADE, :ESTOQUE_ID, :SEQUENCIA, :GRADE_CODIGO, :CONTROLE_ESTOQUE

        
        DO BEGIN

            :CHECK_ESTOQUE = CAST(FN_PARAMETRO('TBPDV.CHECK_ESTOQUE') AS INTEGER);

            IF(:ACAO = 1) THEN   /* INSERT - REALIZAR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                
                IF(:CONTROLE_ESTOQUE = '1') THEN
                BEGIN

                    :SALDO = FN_ESTOQUE_SALDO_DIARIO_DISP(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, :DATA_EMISSAO);
    
                    :SALDO_HOJE = FN_ESTOQUE_SALDO(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO);
    
                    IF((:SALDO < :QUANTIDADE) OR (:SALDO_HOJE < :QUANTIDADE)) THEN
                        BEGIN
                            
                            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE('TBPDV_CFE_ITEM', :ID, 'ESTOQUE INDISPONIVEL PARA ESSE ITEM (PROCEDURE: SP_CFE_ESTOQUE)');

                           :EMAIL               = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                           :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                INTO :DESC_ESTABELECIMENTO;
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                INTO :DESC_LOCALIZACAO;
    
                           :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
    
                           CORPO = 'ESTOQUE INDISPONIVEL PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
        
                           IF(CHAR_LENGTH(:EMAIL) > 0 AND :FLAG_ENVIO_EMAIL = 1)THEN
                           BEGIN
                                IN AUTONOMOUS TRANSACTION DO
                                BEGIN
                                    EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1, 20);
                                END
                           END
    
                           UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
            
                           IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                           BEGIN
                               EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                           END
                           
            
                        END ELSE
                        BEGIN

                            :TRANSACAO_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM', 0, :ID,
                                :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :DATA_EMISSAO, :PRODUTO_ID,
                                :TAMANHO, :QUANTIDADE, 'S', :OPERACAO_CODIGO, 0, '', 'BAIXA AUTOMATICA DE ESTOQUE',
                                :TRANSACAO_ID, :NUMERO_CFE, NULL, NULL, 0, 0, :ID, 0);
    
                            /* INSERIR TRANSACAO */
                            UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                            /* ATUALIZAR TRATAMENTO DO ITEM */
                            UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;
    
                            WHEN ANY DO
                            BEGIN
                                
                                EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE('TBPDV_CFE_ITEM', :ID, 'ERRO NA ATUALIZACAO DE ESTOQUE (PROCEDURE: SP_CFE_ESTOQUE)');
    
                                :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                                :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                    INTO :DESC_ESTABELECIMENTO;
        
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                    INTO :DESC_LOCALIZACAO;
        
                               :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
        
                               CORPO = 'ESTOQUE INDISPONIVEL PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                    CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                    CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                    CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                    CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
            
                               IF(CHAR_LENGTH(:EMAIL) > 0 AND :FLAG_ENVIO_EMAIL = 1)THEN
                               BEGIN
                                    IN AUTONOMOUS TRANSACTION DO
                                    BEGIN
                                        EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1, 20);
                                    END
                               END
        
                               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
                
                               IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                               BEGIN
                                   EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                               END
                                    
    
                            END
                        END
                 END ELSE
                 BEGIN
                    /* INSERIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = 1 WHERE ID = :ID;
    
                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;
                 END
            END ELSE
            IF(:ACAO = 2) THEN  /* EXCLUIR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                IF(:CONTROLE_ESTOQUE = '1') THEN
                BEGIN
                    :TRANSACAO_ID = 0;
                    DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :ESTOQUE_ID;
                    
                    /* EXCLUIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;

                END

            END

        END


END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_ITEM_ESTOQUE (
    PDV_CFE_ID integer,
    PDV_CFE_ITEM_ID integer,
    ESTABELECIMENTO_ID integer,
    CLIENTE_ID integer,
    CAIXA_ID integer,
    NUMERO_CFE integer,
    SERIE_CFE varchar(3),
    DATA_EMISSAO date,
    ACAO integer,
    TRAVAR_SE_FALHAR char(1) = '1')
as
declare variable ID integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(200);
declare variable DESC_ESTABELECIMENTO varchar(500);
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,2);
declare variable SALDO numeric(15,2);
declare variable SALDO_HOJE numeric(15,2);
declare variable LOCALIZACAO_ID integer;
declare variable DESC_LOCALIZACAO varchar(500);
declare variable DESC_TAMANHO varchar(500);
declare variable OPERACAO_CODIGO varchar(3);
declare variable ESTOQUE_ID integer;
declare variable SEQUENCIA integer;
declare variable GRADE_CODIGO integer;
declare variable EMAIL varchar(300);
declare variable CORPO varchar(1000);
declare variable TRANSACAO_ID integer;
declare variable CHECK_ESTOQUE integer;
declare variable FLAG_ENVIO_EMAIL integer;
declare variable CONTROLE_ESTOQUE char(1);
BEGIN

    FOR SELECT FIRST 1
            T.ID,
            T.PRODUTO_ID,
            T.PRODUTO_DESCRICAO,
            T.LOCALIZACAO_ID,
            T.OPERACAO_CODIGO,
            T.TAMANHO,
            T.QUANTIDADE,
            T.ESTOQUE_ID,
            T.SEQUENCIA,
            P.GRADE_CODIGO,
            O.CONTROLE_ESTOQUE
        FROM TBPDV_CFE_ITEM T
        INNER JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
        INNER JOIN TBOPERACAO O ON O.CODIGO = T.OPERACAO_CODIGO
        WHERE T.PDV_CFE_ID = :PDV_CFE_ID
        AND T.ID = :PDV_CFE_ITEM_ID
        AND T.ATUALIZA_ESTOQUE = 1
        INTO :ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :LOCALIZACAO_ID,
            :OPERACAO_CODIGO, :TAMANHO, :QUANTIDADE, :ESTOQUE_ID, :SEQUENCIA, :GRADE_CODIGO, :CONTROLE_ESTOQUE
        
        DO BEGIN

            :CHECK_ESTOQUE = CAST(FN_PARAMETRO('TBPDV.CHECK_ESTOQUE') AS INTEGER);

            IF(:ACAO = 1) THEN   /* INSERT - REALIZAR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                IF(:CONTROLE_ESTOQUE = '1') THEN
                BEGIN

                    :SALDO = FN_ESTOQUE_SALDO_DIARIO_DISP(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, :DATA_EMISSAO);
    
                    :SALDO_HOJE = FN_ESTOQUE_SALDO(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO);
    
                    IF((:SALDO < :QUANTIDADE) OR (:SALDO_HOJE < :QUANTIDADE)) THEN
                        BEGIN

                            INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                                VALUES ('TBPDV_CFE_ITEM', :ID, 'ESTOQUE INDISPONIVEL PARA ESSE ITEM (PROCEDURE: SP_CFE_ITEM_ESTOQUE)');

                           :EMAIL                = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                           :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                INTO :DESC_ESTABELECIMENTO;
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                INTO :DESC_LOCALIZACAO;
    
                           :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
    
                           CORPO = 'ESTOQUE INDISPONIVEL NO DIA '||FORMATDATE(:DATA_EMISSAO)||' PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
        
                           IF(CHAR_LENGTH(:EMAIL) > 0 AND :FLAG_ENVIO_EMAIL = 1)THEN
                           BEGIN
                                IN AUTONOMOUS TRANSACTION DO
                                BEGIN
                                    EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1, 20);
                                END
                           END
    
                           UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
            
                           IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                           BEGIN
                               EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                           END
                           
            
                        END ELSE
                        BEGIN
    
    
                            :TRANSACAO_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
                            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM', 0, :ID,
                                :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :DATA_EMISSAO, :PRODUTO_ID,
                                :TAMANHO, :QUANTIDADE, 'S', :OPERACAO_CODIGO, 0, '', 'BAIXA AUTOMATICA DE ESTOQUE',
                                :TRANSACAO_ID, :NUMERO_CFE, NULL, NULL, 0, 0, :ID, 0);
    
                            /* INSERIR TRANSACAO */
                            UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                            /* ATUALIZAR TRATAMENTO DO ITEM */
                            UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;
    
                            WHEN ANY DO
                            BEGIN
    
                                INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                                VALUES ('TBPDV_CFE_ITEM', :ID, 'ERRO NA ATUALIZACAO DE ESTOQUE (PROCEDURE: SP_CFE_ITEM_ESTOQUE)');
    
                                :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                                :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                    INTO :DESC_ESTABELECIMENTO;
        
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                    INTO :DESC_LOCALIZACAO;
        
                               :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
        
                               CORPO = 'ESTOQUE INDISPONIVEL PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                    CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                    CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                    CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                    CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
            
                               IF(CHAR_LENGTH(:EMAIL) > 0 AND :FLAG_ENVIO_EMAIL = 1)THEN
                               BEGIN
                                    IN AUTONOMOUS TRANSACTION DO
                                    BEGIN
                                        EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1, 20);
                                    END
                               END
        
                               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
                
                               IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                               BEGIN
                                   EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                               END
                                    
    
                            END
                         END

                END ELSE
                BEGIN

                    /* INSERIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = 1 WHERE ID = :ID;

                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;

                END


            END ELSE
            IF(:ACAO = 2) THEN  /* EXCLUIR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                IF(:CONTROLE_ESTOQUE = '1') THEN
                BEGIN
                    :TRANSACAO_ID = 0;
                    DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :ESTOQUE_ID;
                    
                    /* EXCLUIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
                END

            END

        END


END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CORRIGIR_ESTOQUE_PLACA
as
declare variable PRODUTO_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable SALDO_ESTOQUE numeric(18,8);
declare variable SALDO_PECA numeric(18,8);
declare variable SALDO_ALOCADO numeric(18,8);
declare variable QUANTIDADE numeric(18,8);
declare variable TIPO char(1);
declare variable OPERACAO varchar(10);
declare variable STATUS integer;
declare variable OBSERVACAO varchar(100);
declare variable CCUSTO varchar(10);
declare variable EMAIL blob sub_type 1 segment size 80;
declare variable ENVIAR_EMAIL integer;
declare variable PRODUTO_DESCRICAO varchar(100);
declare variable DESTINATARIOS varchar(500);
declare variable LINHAS blob sub_type 1 segment size 80;
declare variable TRANSACAO_ID integer;
declare variable DOCUMENTO varchar(50);
begin

    ENVIAR_EMAIL = 0;
    LINHAS = '';

    for
        select
            PRODUTO_DESCRICAO,
            PRODUTO_ID,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            SALDO_ESTOQUE,
            SALDO_PECA,
            SALDO_ALOCADO,
            CCUSTO
        from(
            SELECT
                p.descricao as PRODUTO_DESCRICAO,
                s.estabelecimento_codigo as ESTABELECIMENTO_ID,
                s.codigo as LOCALIZACAO_ID,
                p.codigo as produto_id,
                FN_ESTOQUE_SALDO_DISPONIVEL(s.estabelecimento_codigo, s.codigo, p.codigo, 0) as saldo_estoque,
                FN_ESTOQUE_SALDO_ALOCADO(s.estabelecimento_codigo, s.codigo, p.codigo, 0) as saldo_ALOCADO,
                --coalesce((select sum(e.saldo) from VWESTOQUE_PLACA e where e.produto_id = p.codigo),0) as saldo_peca,
                s.CCUSTO,

                coalesce((SELECT
                        sum(cast( y.quantidade_saldo as integer)) as SALDO
                    from tbproduto p1,TBREMESSA_ITEM_PROCESSADO X, TBPEDIDO_ITEM_PROCESSADO y

                    WHERE p1.codigo = p.codigo
                    and p1.codigo = x.produto_codigo
                    and y.status_saldo = 1
                    and x.situacao in (2,3)
                    and y.remessa = x.remessa
                    and y.remessa_acumulado_controle = x.controle
                    --and (y.remessa_acumulado_controle >= 5500 or y.remessa = 1)
                    ),0) as saldo_peca
        
            from tbproduto p, tbproduto_ficha f, tblocalizacao s
            where p.familia_alternativa = (select fn_parametro('SISTEMA.FAMILIA_PLACA') from rdb$database)
            and f.produto_codigo        =  p.codigo
            and s.codigo                = fn_parametro('SISTEMA.LOCALIZACAO_PLACAS')
            
        ) where (saldo_estoque + saldo_ALOCADO) <> saldo_peca
        --and saldo_peca >= 2500
    into
        PRODUTO_DESCRICAO,
        PRODUTO_ID,
        ESTABELECIMENTO_ID,
        LOCALIZACAO_ID,
        SALDO_ESTOQUE,
        SALDO_PECA,
        SALDO_ALOCADO,
        CCUSTO
    do begin

        STATUS = 0;
        CCUSTO = '';

        SALDO_ESTOQUE = SALDO_ESTOQUE +  SALDO_ALOCADO;

        if(SALDO_ESTOQUE > SALDO_PECA)then
        begin
            QUANTIDADE = SALDO_ESTOQUE - SALDO_PECA;
            TIPO       = 'S';
            OPERACAO   = fn_parametro('SISTEMA.OPERACAO_SAIDA_PRODUTO');
            STATUS     = 1;
            OBSERVACAO = 'AJUSTE AUTOMÁTICO DE ESTOQUE DE PLACAS';

            if((SALDO_ESTOQUE - QUANTIDADE) < SALDO_ALOCADO)then
            begin
                STATUS  = 2;
                TIPO    = '';
                OPERACAO= '';
            end
        end else
        begin
            if(SALDO_PECA > SALDO_ESTOQUE)then
            begin
                QUANTIDADE = SALDO_PECA - SALDO_ESTOQUE;
                TIPO       = 'E';
                OPERACAO   = fn_parametro('SISTEMA.OPERACAO_ENTRADA_PRODUTO');
                STATUS     = 1;
                OBSERVACAO = 'AJUSTE AUTOMÁTICO DE ESTOQUE DE PLACAS';
            end
        end

        TRANSACAO_ID = 0;

        if(STATUS = 1)then
        begin

            TRANSACAO_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

            DOCUMENTO = fn_lpad(extract(day from current_date),2,'0')||fn_lpad(extract(month from current_date),2,'0')||extract(year from current_date);

            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
                'TBREQUISICAO_PLACA',
                1,
                :PRODUTO_ID,
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID,
                current_date,
                :PRODUTO_ID,
                1,
                :QUANTIDADE,
                :TIPO,
                :OPERACAO,
                0,
                :CCUSTO,
                :OBSERVACAO,
                :TRANSACAO_ID,
                :DOCUMENTO,
                0,
                0,
                0,
                0
            );
        end

        if(STATUS > 0)then
        begin
            ENVIAR_EMAIL = 1;
            LINHAS = LINHAS||
                    '<tr>
                            <td class="string"> <a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_15060?PRODUTO_ID='||PRODUTO_ID||'&LOCALIZACAO_ID='||LOCALIZACAO_ID||'">'|| fn_lpad(PRODUTO_ID,7,'0')||' - '||PRODUTO_DESCRICAO || '</a></td>
                            <td class="number"> ' || fn_format_number2(SALDO_ESTOQUE,4)                             || '</td>
                            <td class="number"> ' || fn_format_number2(SALDO_ALOCADO,4)                             || '</td>
                            <td class="number"> ' || fn_format_number2(SALDO_PECA,4)                                || '</td>
                            <td class="number"> ' || fn_format_number2(QUANTIDADE,4)                                || '</td>
                            <td class="data">   ' || TIPO                                                           || '</td>
                            <td class="data">   ' || OPERACAO                                                       || '</td>
                            <td class="data">   ' || iif(STATUS = 2, 'NÃO BAIXADO (ALOCADO)','ID:'||TRANSACAO_ID)   || '</td>
                     </tr> ';
        end
    end

    if(enviar_email = 1)then
    begin
        destinatarios = fn_parametro('SISTEMA.EMAIL_AJUSTE_PLACAS');

        EMAIL = '<style>
                    table, th, td { border: 1px solid black; border-collapse: collapse; }
                    th.number { text-align: end; }
                    td.number { text-align: end; }
                    tr:nth-child(2n+2) { background: #eee; }
                    td { padding: 3px; }
                </style>
                
            <hr/>
                <h2>PLACAS COM DIFERENÇA ESTOQUE/PEÇA</h2>
            <hr/>
            <table>
                <thead>
                    <tr>              
                        <th class="string">PRODUTO    </th>
                        <th class="number">ESTOQUE    </th>
                        <th class="number">ALOCADO    </th>
                        <th class="number">PEÇA       </th>
                        <th class="number">AJUSTE     </th>
                        <th class="data">TIPO       </th>
                        <th class="data">OPERAÇÃO   </th>
                        <th class="string">OBSERVAÇÃO </th>
                    </tr>
                </thead>
                <tbody>
                ' || LINHAS || '
                </tbody>
            </table><br/><br/>';

        execute procedure SPI_EMAIL(
            :destinatarios,
            'GC - AJUSTE AUTOMÁTICO DE ESTOQUE DE PLACAS',
            :EMAIL,
            1,
            16
        );
    end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_EXCLUIR_PRECOS_BOJO (
    DESTINATARIOS varchar(500),
    EXCLUIR_PRECO char(1),
    DIAS integer)
as
declare variable ID integer;
declare variable TABELA varchar(200);
declare variable CLIENTE varchar(200);
declare variable MODELO varchar(200);
declare variable PRODUTO varchar(200);
declare variable PRECO numeric(18,5);
declare variable EMAIL blob sub_type 1 segment size 80;
declare variable ENVIAR_EMAIL integer;
declare variable LINHAS blob sub_type 1 segment size 80;
begin

  /* PREÇOS DE MODELOS POR CLIENTES */

    ENVIAR_EMAIL = 0;
    LINHAS = '';

    for
        SELECT --FIRST 10
               ID,
               FN_LPAD(TABELA_ID,3,'0') ||' - '||TABELA_DESCRICAO AS TABELA,
               FN_LPAD(CLIENTE_ID,5,'0')||' - '||CLIENTE_RAZAOSOCIAL||'/'||CLIENTE_UF CLIENTE,
               FN_LPAD(MODELO_ID,6,'0') ||' - '||MODELO_DESCRICAO MODELO,
               PRECO
        FROM (
                SELECT A.ID,
                       B.ID TABELA_ID, B.DESCRICAO TABELA_DESCRICAO,
                       E.CODIGO CLIENTE_ID, E.RAZAOSOCIAL CLIENTE_RAZAOSOCIAL, E.UF CLIENTE_UF,
                       A.MODELO_CODIGO MODELO_ID, M.DESCRICAO MODELO_DESCRICAO,
                       A.PRECO_VENDA AS PRECO,
                       (SELECT MAX(P.DATA) FROM TBPEDIDO P, TBPEDIDO_ITEM PI
                         WHERE P.PEDIDO = PI.PEDIDO
                           AND PI.MODELO_CODIGO = A.MODELO_CODIGO
                           AND P.CLIENTE_CODIGO = A.CLIENTE_CODIGO
                           AND P.DATA >= CURRENT_DATE - :DIAS ) DATA_ULTIMO_PEDIDO
                  FROM TBTABELA_PRECO B, TBCLIENTE_MODELO_PRECO A, TBMODELO M, TBEMPRESA E
                 WHERE B.ID = A.TABELA_ID
                   AND M.CODIGO = A.MODELO_CODIGO
                   AND A.CLIENTE_CODIGO = E.CODIGO
                   AND CURRENT_DATE BETWEEN B.DATA_INICIAL AND B.DATA_FINAL
                   AND M.FAMILIA_CODIGO = 3
                   AND A.DATAHORA < CURRENT_DATE - :DIAS
        )  WHERE DATA_ULTIMO_PEDIDO IS NULL
        ORDER BY CLIENTE_RAZAOSOCIAL, MODELO_DESCRICAO

    into
        :ID,
        :TABELA,
        :CLIENTE,
        :MODELO,
        :PRECO
    do begin

        if(ID > 0)then
        begin
                if (EXCLUIR_PRECO = '1') then
                    begin
                    DELETE FROM TBCLIENTE_MODELO_PRECO WHERE ID = :ID;
                    end

                ENVIAR_EMAIL = 1;
                LINHAS = LINHAS||
                        '<tr>
                                <td class="data">   ' || TABELA                     || '</td>
                                <td class="data">   ' || CLIENTE                    || '</td>
                                <td class="data">   ' || MODELO                     || '</td>
                                <td class="number"> ' || fn_format_number2(PRECO,4) || '</td>
                         </tr> ';
        end

       end

    if(ENVIAR_EMAIL = 1)then
    begin

        EMAIL = '<style>
                    table, th, td { border: 1px solid black; border-collapse: collapse; }
                    th.number { text-align: end; }
                    td.number { text-align: end; }
                    tr:nth-child(2n+2) { background: #eee; }
                    td { padding: 3px; }
                </style>
                
            <hr/>
                <h2>Listagem dos Preços Excluídos:</h2>
            <hr/>
            <table>
                <thead>
                    <tr>              
                        <th class="string">TABELA    </th>
                        <th class="string">CLIENTE   </th>
                        <th class="string">MODELO    </th>
                        <th class="number">PREÇO     </th>
                    </tr>
                </thead>
                <tbody>
                ' || LINHAS || '
                </tbody>
            </table><br/><br/>';


        execute procedure SPI_EMAIL(
            :DESTINATARIOS,
            'GCWeb - EXCLUSAO DE PRECOS DE MODELOS DE BOJOS POR CLIENTES NÃO VENDIDOS A MAIS DE '||:DIAS||' DIAS',
            :EMAIL,
            1,
            5
        );
    end

  /* PREÇOS DE PRODUTOS POR CLIENTE */

    ENVIAR_EMAIL = 0;
    LINHAS = '';

    for
        SELECT --FIRST 10
               ID,
               FN_LPAD(TABELA_ID,3,'0') ||' - '||TABELA_DESCRICAO AS TABELA,
               FN_LPAD(CLIENTE_ID,5,'0')||' - '||CLIENTE_RAZAOSOCIAL||'/'||CLIENTE_UF CLIENTE,
               FN_LPAD(PRODUTO_ID,6,'0') ||' - '||PRODUTO_DESCRICAO PRODUTO,
               PRECO
        FROM (
                SELECT A.ID,
                       B.ID TABELA_ID, B.DESCRICAO TABELA_DESCRICAO,
                       E.CODIGO CLIENTE_ID, E.RAZAOSOCIAL CLIENTE_RAZAOSOCIAL, E.UF CLIENTE_UF,
                       A.PRODUTO_CODIGO PRODUTO_ID, M.DESCRICAO PRODUTO_DESCRICAO,
                       A.PRECO_VENDA AS PRECO,
                       (SELECT MAX(P.DATA) FROM TBPEDIDO P, TBPEDIDO_ITEM PI
                         WHERE P.PEDIDO = PI.PEDIDO
                           AND PI.PRODUTO_CODIGO = A.PRODUTO_CODIGO
                           AND P.CLIENTE_CODIGO = A.CLIENTE_CODIGO
                           AND P.DATA >= CURRENT_DATE - :DIAS) DATA_ULTIMO_PEDIDO
                  FROM TBTABELA_PRECO B, TBCLIENTE_PRODUTO_PRECO A, TBPRODUTO M, TBEMPRESA E
                 WHERE B.ID = A.TABELA_ID
                   AND M.CODIGO = A.PRODUTO_CODIGO
                   AND A.CLIENTE_CODIGO = E.CODIGO
                   AND CURRENT_DATE BETWEEN B.DATA_INICIAL AND B.DATA_FINAL
                   AND M.FAMILIA_CODIGO = 3
                   AND A.DATAHORA < CURRENT_DATE - :DIAS
        )  WHERE DATA_ULTIMO_PEDIDO IS NULL
        ORDER BY CLIENTE_RAZAOSOCIAL, PRODUTO_DESCRICAO

    into
        :ID,
        :TABELA,
        :CLIENTE,
        :PRODUTO,
        :PRECO
    do begin

        if(ID > 0)then
        begin
                if (EXCLUIR_PRECO = '1') then
                    begin
                    DELETE FROM TBCLIENTE_PRODUTO_PRECO WHERE ID = :ID;
                    end

                ENVIAR_EMAIL = 1;
                LINHAS = LINHAS||
                        '<tr>
                                <td class="data">   ' || TABELA                     || '</td>
                                <td class="data">   ' || CLIENTE                    || '</td>
                                <td class="data">   ' || PRODUTO                    || '</td>
                                <td class="number"> ' || fn_format_number2(PRECO,4) || '</td>
                         </tr> ';
        end

       end

    if(ENVIAR_EMAIL = 1)then
    begin

        EMAIL = '<style>
                    table, th, td { border: 1px solid black; border-collapse: collapse; }
                    th.number { text-align: end; }
                    td.number { text-align: end; }
                    tr:nth-child(2n+2) { background: #eee; }
                    td { padding: 3px; }
                </style>
                
            <hr/>
                <h2>Listagem dos Preços Excluídos:</h2>
            <hr/>
            <table>
                <thead>
                    <tr>              
                        <th class="string">TABELA    </th>
                        <th class="string">CLIENTE   </th>
                        <th class="string">PRODUTO   </th>
                        <th class="number">PREÇO     </th>
                    </tr>
                </thead>
                <tbody>
                ' || LINHAS || '
                </tbody>
            </table><br/><br/>';


        Execute procedure SPI_EMAIL(
            :DESTINATARIOS,
            'GCWeb - EXCLUSAO DE PRECOS DE PRODUTOS DE BOJOS POR CLIENTES NAO VENDIDOS A MAIS DE '||:DIAS||' DIAS',
            :EMAIL,
            1,
            5
        );
    end


end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_MFE_PULOS
as
declare variable CUPOM integer;
declare variable DATA varchar(16);
declare variable CANCELAMENTO integer;
declare variable PROXIMO bigint;
declare variable FLAG char(6);
declare variable FLAG2 char(6);
declare variable CORPO varchar(800);
declare variable TITULO varchar(100);
begin

    for
        select first 50
            COO as CUPOM,
            formatdatetime(dhrecbto) as DATA,
            CANCELAMENTO as CANCELAMENTO,
            iif(PROXIMO = 0, COO + 1, PROXIMO) as PROXIMO,
            iif(iif(CANCELAMENTO > 0, CANCELAMENTO + 1 = PROXIMO, COO + 1 = PROXIMO) or PROXIMO = 0, '','Quebra') as FLAG,
            iif(iif(CANCELAMENTO > 0, CANCELAMENTO + 1 = PROXIMO, COO + 1 = PROXIMO) or PROXIMO = 0, 0, 1) as FLAG2
        from(
            select
                e.dhrecbto,
                e.coo,
                coalesce( e.sat_numero_cancelamento,0) CANCELAMENTO,
                coalesce(lag(e.coo) over(order by e.coo desc),0) as PROXIMO
            
            from tbmfe e
            order by e.coo desc
        )

    into
        CUPOM,
        DATA,
        CANCELAMENTO,
        PROXIMO,
        FLAG,
        FLAG2
    do begin

      if(FLAG2 > 0)then
      begin

        TITULO = 'MFE - Pulos no coo';
        CORPO  = :TITULO||'<br><a class="msg-balao-fechar" href="'||fn_parametro(552)||'/_28000/154?AUTO=1" target="_blank" >Visualizar no GC-Web</a> ';

        in autonomous transaction do
        begin
            execute procedure SPI_EMAIL( fn_parametro(584), :TITULO, :CORPO, 1, 20);
        end

      end

    end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOVO_VALE_MFE (
    ENTRADA integer)
returns (
    SAIDA integer)
as
declare variable EMAIL varchar(300);
declare variable ITENS integer;
declare variable CORPO2 blob sub_type 0 segment size 80;
declare variable DATA_EMISSAO date;
declare variable CUPOM integer;
declare variable SERIE integer;
declare variable CAIXA varchar(100);
declare variable ID integer;
declare variable DESCRICAO varchar(100);
declare variable QUANTIDADE integer;
declare variable VALOR numeric(18,2);
declare variable TAMANHO varchar(20);
declare variable ESTABELECIMENTO_ID varchar(100);
declare variable NEWSERIE integer;
declare variable NEWCAIXA_ID integer;
declare variable NEWCUPOM integer;
declare variable NEWCLIENTE varchar(100);
declare variable NEWCPF varchar(100);
declare variable NEWCODIGO_VALE varchar(100);
declare variable NEWOPERADOR integer;
declare variable NEWVALOR numeric(18,2);
declare variable NEWDATA timestamp;
declare variable NEWID integer;
declare variable CORPO blob sub_type 0 segment size 80;
declare variable NEWENDERECO varchar(300);
declare variable NEWNUMERO varchar(300);
declare variable NEWCOMPLEMENTO varchar(300);
declare variable NEWCEP varchar(300);
declare variable NEWBAIRRO varchar(300);
declare variable NEWCIDADE varchar(300);
declare variable NEWUF varchar(300);
declare variable NEWREVENDA varchar(300);
declare variable NEWCHAVE_ACESSO varchar(300);
begin

  for
     select
        ID,
        SERIE,
        CAIXA_ID,
        CUPOM,
        CLIENTE,
        CPF,
        CODIGO_VALE,
        OPERADOR,
        VALOR,
        DATA,
        coalesce(endereco,'') as endereco,
        coalesce(numero,'') as numero,
        coalesce(complemento,'') as complemento,
        coalesce(cep,'') as cep,
        coalesce(bairro,'') as bairro,
        coalesce(cidade,'') as cidade,
        coalesce(uf,'') as uf,
        iif(revenda = 0,'<b>Em</b> condições de revenda.','<b>Sem</b> condições de revenda.') as revenda,
        chave_acesso
    from(
        select
            v.id,
            v.serie,
            v.caixa_id,
            v.cupom,
            v.cliente,
            v.cpf,
            v.codigo_vale,
            v.operador,
            v.valor,
            v.endereco,
            v.numero,
            v.complemento,
            v.cep,
            v.bairro,
            v.cidade,
            v.uf,
            v.revenda,
            coalesce((select
                sum((d.quantidade * (i.vl_unitario - i.vl_desconto))) as VALOR
                from tbmfe_vales_detalhe d, tbmfe_item i
                where d.vale_id =  v.id
                and i.item = d.item
                and i.numero = v.cupom
                and i.serie = v.serie
                and i.caixa_id = v.caixa
            ),0) as VALOR_ITENS,
            v.data,
            coalesce(e.chave_acesso,'') as chave_acesso
         from tbmfe_vales v
         left join tbmfe e on e.numero = v.cupom and e.serie = v.serie and e.caixa_id = v.caixa
         where v.notificacao = 0
    ) where valor <= VALOR_ITENS
  into
    NEWid,
    NEWserie,
    NEWcaixa_id,
    NEWcupom,
    NEWcliente,
    NEWcpf,
    NEWcodigo_vale,
    NEWoperador,
    NEWvalor,
    NEWdata,
    newendereco,
    newnumero,
    newcomplemento,
    newcep,
    newbairro,
    newcidade,
    newuf,
    newrevenda,
    NEWCHAVE_ACESSO
  do begin
    if(:NEWcupom > 0)then
    begin
       --email = 'anderson@delfa.com.br';
       email = fn_parametro('SISTEMA.EMAIL_VALE_PDV');

       select first 1 E.sat_numero_cfe, E.serie, E.caixa_id||' - '||C.descricao as CAIXA FROM TBMFE E, tbquiosque_caixa C WHERE E.numero = :NEWcupom AND E.serie = :NEWserie AND C.id = E.caixa_id
       INTO :CUPOM, :SERIE, :CAIXA;

       :CUPOM = coalesce(:CUPOM, 0);
       :SERIE = coalesce(:SERIE, 0);
       :CAIXA = coalesce(:CAIXA, '');

       ESTABELECIMENTO_ID = coalesce((select first 1 Q.estabelecimento_id||'-'||A.nomefantasia FROM tbquiosque Q, tbestabelecimento A WHERE Q.id = :NEWcaixa_id AND A.codigo = Q.estabelecimento_id),'');

       corpo = 'NOVO VALE PARA O MFE:'||:CUPOM||'-'||:SERIE||', CAIXA:'||:CAIXA||'<BR>';
            corpo = corpo||'ESTABELECIMENTO: '||:ESTABELECIMENTO_ID||'<BR>';
            corpo = corpo||'CHAVE ACESSO: '||:NEWCHAVE_ACESSO||'<BR>';
            corpo = corpo||'VALE: '||:NEWcodigo_vale||'<BR>';
            corpo = corpo||'VALOR: '||:NEWvalor||'<BR>';
            corpo = corpo||'OPERADOR: '||coalesce((select first 1 U.nome FROM tbpdv_usuarios U WHERE U.id = :NEWoperador),'')||'<BR>';
            corpo = corpo||'DATA: '||formatdatetime(:NEWdata)||'<BR>';

      corpo = corpo||'<br>';
            CORPO = CORPO||'CLIENTE: '||:NEWCLIENTE||'<BR>';
            CORPO = CORPO||'CPF/CNPJ: '||:NEWCPF||'<BR>';
            CORPO = CORPO||'ENDEREÇO: '||NEWENDERECO||'<BR>';
            CORPO = CORPO||'NÚMERO: '||NEWNUMERO||'<BR>';
            CORPO = CORPO||'COMPLEMENTO: '||NEWCOMPLEMENTO||'<BR>';
            CORPO = CORPO||'CEP: '||NEWCEP||'<BR>';
            CORPO = CORPO||'BAIRRO: '||NEWBAIRRO||'<BR>';
            CORPO = CORPO||'CIDADE: '||NEWCIDADE||'<BR>';
            CORPO = CORPO||'UF: '||NEWUF||'<BR><BR>';

            corpo = corpo||'PRODUTO: '||newrevenda||'<BR>';

            corpo2 = '';
            corpo2 = corpo2||'<BR>';
            corpo2 = corpo2||'PRODUTOS:<BR>';

            corpo2 = corpo2||'<table border="1">';
            corpo2 = corpo2||'  <tr style="background-color: aquamarine;"> ';
            corpo2 = corpo2||'    <th>ID</th>';
            corpo2 = corpo2||'    <th>Descri&ccedil;&atilde;o</th>';
            corpo2 = corpo2||'    <th>Tamanho</th>';
            corpo2 = corpo2||'    <th>Quantidade</th>';
            corpo2 = corpo2||'    <th>Valor</th>';
            corpo2 = corpo2||'  </tr>';

            itens = 0;


            for
               select
                   p.codigo as ID,
                   p.descricao,
                   fn_tamanho_grade(p.grade_codigo, i.tamanho) as TAMANHO,
                   g.quantidade,
                   (g.quantidade * (i.vl_unitario - i.vl_desconto)) as VALOR
               from tbmfe_vales_detalhe g, tbproduto p, tbmfe_item i
               where g.vale_id = :NEWid
               and g.item = i.item
               and p.codigo = i.produto_id
               and i.serie = :NEWserie
               and i.numero = :NEWcupom
            into
              :id,
              :descricao, 
              :TAMANHO,
              :quantidade, 
              :valor
            do begin
                itens = itens + 1;

                corpo2 = corpo2||'  <tr>';
                corpo2 = corpo2||'    <td>'||coalesce(:id,0)||'</td>';
                corpo2 = corpo2||'    <td>'||coalesce(:descricao,'')||'</td>';
                corpo2 = corpo2||'    <td>'||coalesce(:TAMANHO,'')||'</td>';
                corpo2 = corpo2||'    <td>'||coalesce(:quantidade,0)||'</td>';
                corpo2 = corpo2||'    <td>'||coalesce(:valor,'')||'</td>';
                corpo2 = corpo2||'  </tr>';
            end



            corpo2 = corpo2||'</table>';

            if(itens > 0)then
            begin
              corpo = corpo || corpo2;
            end

            corpo = FN_STRING_TO_HTML(:corpo);
    
       if(char_length(email) > 0)then
       begin

          IN AUTONOMOUS TRANSACTION DO
          BEGIN
            UPDATE TBMFE_VALES SET NOTIFICACAO = 1 WHERE (ID = :NEWid);
          END
            
          execute procedure SPI_EMAIL(:email, 'NOVO VALE NO PDV, MFE:'||:CUPOM||'-'||:SERIE||', ESTB:'||:estabelecimento_id||', CAIXA'||:CAIXA, :corpo, 1, 20);
       end
    
    end
  end

  SAIDA = 1;
  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_PEDIDO_ITEM_INTEGRIDADE
as
declare variable DATA date;
declare variable DATA_ENTREGA date;
declare variable DATA_CLIENTE date;
declare variable DATA_PRODUCAO date;
declare variable PEDIDO integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(4000);
declare variable TAMANHO integer;
declare variable TAMANHO_DESCRICAO varchar(200);
declare variable QUANTIDADE numeric(18,5);
declare variable SITUACAO integer;
declare variable SITUACAO_DESCRICAO varchar(50);
declare variable CONTROLE integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QUANTIDADE_FATURAR numeric(18,5);
declare variable DIF numeric(18,5);
declare variable CHK_QTD_EST numeric(18,4);
declare variable CHK_QTD_REM numeric(18,4);
declare variable CHK_QTD_AGP numeric(18,4);
declare variable DIF_QTD_EST boolean;
declare variable DIF_QTD_AGP boolean;
declare variable DIF_QTD_REM boolean;
declare variable ERRO_ITEM varchar(3000);
declare variable ERROS varchar(3000);
begin

    ERROS = '';

    FOR
        SELECT
            DATA,
            DATA_ENTREGA,
            DATA_CLIENTE,
            DATA_PRODUCAO,
            PEDIDO,
            PRODUTO_ID,  
            FN_DESCRICAO('TBPRODUTO',X.PRODUTO_ID) PRODUTO_DESCRICAO,
            TAMANHO, 
            FN_TAMANHO_PRODUTO(X.PRODUTO_ID,X.TAMANHO) TAMANHO_DESCRICAO,
            QUANTIDADE,
            SITUACAO,
            CASE SITUACAO
            WHEN 1 THEN '01 - A FATURAR'
            WHEN 2 THEN '02 - FATURADO'
            WHEN 3 THEN '03 - ENCERRADO'
            END SITUACAO_DESCRICAO,
            CONTROLE,
            QTD_EST,
            QTD_AGP,
            QTD_REM,
            QUANTIDADE_FATURAR,
            DIF,
            CHK_QTD_EST,
            CHK_QTD_REM,
            CHK_QTD_AGP,
            IIF(QTD_EST <> CHK_QTD_EST,TRUE,FALSE) DIF_QTD_EST,
            IIF(QTD_AGP <> CHK_QTD_AGP,TRUE,FALSE) DIF_QTD_AGP,
            IIF(QTD_REM <> CHK_QTD_REM,TRUE,FALSE) DIF_QTD_REM
        
        FROM (
            SELECT
            P.DATA,
            P.DATA_ENTREGA,
            P.DATA_CLIENTE,
            P.DATA_PRODUCAO,
            I.PEDIDO,
            I.PRODUTO_CODIGO PRODUTO_ID,
            I.TAMANHO,
            I.QUANTIDADE,
            I.SITUACAO,
            I.CONTROLE,
            I.QTD_EST,
            I.QTD_AGP,
            I.QTD_REM,
            IIF(I.SITUACAO=1,S.QUANTIDADE,0) QUANTIDADE_FATURAR,
        
            IIF( IIF(I.SITUACAO=1,S.QUANTIDADE,0) - I.QTD_EST - I.QTD_REM - I.QTD_AGP < 0, IIF(I.SITUACAO=1,S.QUANTIDADE,0) - I.QTD_EST - I.QTD_REM - I.QTD_AGP, 0) DIF,
        
            COALESCE((SELECT SUM(A.SALDO)
                        FROM TBESTOQUE_DETALHE_ALOCACAO A
                       WHERE A.TABELA_ID = I.PEDIDO
                         AND A.TAB_ITEM_ID = I.CONTROLE
                         AND A.SALDO > 0
                         AND A.TIPO = 'P'),0) CHK_QTD_EST,
            
            COALESCE((SELECT SUM(B.SALDO)
                        FROM TBREMESSA_ITEM_ALOCACAO B
                       WHERE B.TABELA_ID = I.PEDIDO
                         AND B.TAB_ITEM_ID = I.CONTROLE
                         AND B.SALDO > 0
                         AND B.TABELA_ID > 0),0) CHK_QTD_REM,
        
        
            COALESCE((SELECT SUM(AGP.SALDO) FROM TBAGRUPAMENTO_PEDIDO AGP
                       WHERE AGP.TABELA_ID = I.PEDIDO
                         AND AGP.TAB_ITEM_ID = I.CONTROLE
                         AND AGP.TIPO = 'P'),0) CHK_QTD_AGP
        
            FROM
                TBPEDIDO P,
                TBPEDIDO_ITEM I,
                TBPEDIDO_ITEM_SALDO S
            
            WHERE TRUE
            AND P.DATA > DATEADD(-6 MONTH TO CURRENT_DATE)
            AND I.PEDIDO = P.PEDIDO
            AND S.PEDIDO = I.PEDIDO
            AND S.PEDIDO_ITEM_CONTROLE = I.CONTROLE

            ORDER BY I.PEDIDO,I.SEQUENCIA
        ) X
        
        WHERE TRUE
        AND (IIF(X.SITUACAO <> 1, X.CHK_QTD_EST > 0 OR X.CHK_QTD_AGP > 0 OR X.CHK_QTD_REM > 0, FALSE) -- VERIFICA SE HA SALDO DEPOIS DE FATURADO OU ENCERRADO
          OR IIF(X.SITUACAO  = 1,
                 DIF < 0  --VERIFICA SE HA DIVERGENCIA NA QUANTIDADE A PRODUZIR COM O PEDIDO EM ABERTO
              OR X.QTD_EST <> X.CHK_QTD_EST  --VERIFICA SE HA DIVERGENCIA NO ESTOQUE ALOCADO COM O PEDIDO EM ABERTO
              OR X.QTD_AGP <> X.CHK_QTD_AGP --VERIFICA SE HA DIVERGENCIA NO AGRUPAMENTO COM O PEDIDO EM ABERTO
              OR X.QTD_REM <> X.CHK_QTD_REM --VERIFICA SE HA DIVERGENCIA EM REMESSAS COM O PEDIDO EM ABERTO
              , FALSE))
    INTO
        DATA,
        DATA_ENTREGA,
        DATA_CLIENTE,
        DATA_PRODUCAO,
        PEDIDO,
        PRODUTO_ID,
        PRODUTO_DESCRICAO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        QUANTIDADE,
        SITUACAO,
        SITUACAO_DESCRICAO,
        CONTROLE,
        QTD_EST,
        QTD_AGP,
        QTD_REM,
        QUANTIDADE_FATURAR,
        DIF,
        CHK_QTD_EST,
        CHK_QTD_REM,
        CHK_QTD_AGP,
        DIF_QTD_EST,
        DIF_QTD_AGP,
        DIF_QTD_REM

--        PRODUTO_DESCRICAO,
--        TAMANHO_DESCRICAO,
--        DATA,
--        DATA_ENTREGA,
--        DATA_CLIENTE,
--        DATA_PRODUCAO,
--        PEDIDO,
--        PRODUTO_ID,
--        TAMANHO,
--        QUANTIDADE,
--        SITUACAO,
--        SITUACAO_DESCRICAO,
--        CONTROLE,
--        QTD_EST,
--        QTD_AGP,
--        QTD_REM,
--        QUANTIDADE_FATURAR,
--        DIF,
--        CHK_QTD_EST,
--        CHK_QTD_REM,
--        CHK_QTD_AGP,
--        DIF_QTD_EST,
--        DIF_QTD_AGP,
--        DIF_QTD_REM
    DO
    BEGIN
        ERRO_ITEM = '';

        IF ( SITUACAO <> 1 AND CHK_QTD_EST > 0 ) THEN
        BEGIN
            ERRO_ITEM = 'COM ESTOQUE ALOCADO. QTD: ' || CHK_QTD_EST;
        END

        IF ( SITUACAO <> 1 AND CHK_QTD_AGP > 0 ) THEN
        BEGIN                                        
            ERRO_ITEM = 'COM QUANTIDADE EM AGRUPAMENTO. QTD: ' || CHK_QTD_AGP;
        END

        IF ( SITUACAO <> 1 AND CHK_QTD_REM > 0 ) THEN
        BEGIN                                              
            ERRO_ITEM = 'COM TALOES GERADOS. QTD: ' || CHK_QTD_REM;
        END    

        IF ( SITUACAO = 1 AND DIF < 0 ) THEN
        BEGIN
            ERRO_ITEM = 'DIVERGENCIA DE QUANTIDADE ALOCADA EM RELACAO A FATURAR. QTD A FATURAR: ' || QUANTIDADE_FATURAR || ' DIFERENCA ALOCADA: ' || (DIF * -1);
        END

        IF ( SITUACAO = 1 AND QTD_EST <> CHK_QTD_EST ) THEN
        BEGIN                           
            ERRO_ITEM = 'DIVERGENCIA NO SOMATORIO DE ESTOQUE ALOCADO. QTD NO ITEM: ' || QTD_EST || ' QTD NOS REGISTROS: ' || CHK_QTD_EST;
        END

        IF ( SITUACAO = 1 AND QTD_AGP <> CHK_QTD_AGP ) THEN
        BEGIN
            ERRO_ITEM = 'DIVERGENCIA NO AGRUPAMENTO. QTD NO ITEM: ' || QTD_AGP || ' QTD NOS REGISTROS: ' || CHK_QTD_AGP;
        END

        IF ( SITUACAO = 1 AND QTD_REM <> CHK_QTD_REM ) THEN
        BEGIN
            ERRO_ITEM = 'DIVERGENCIA NA QUANTIDADE EM REMESSA. QTD NO ITEM: ' || QTD_REM || ' QTD NOS REGISTROS: ' || CHK_QTD_REM;
        END

        IF ( ERRO_ITEM <> '' ) THEN
        BEGIN
            ERROS = ERROS || 'PEDIDO: ' || PEDIDO || ' ITEM CONTROLE: ' || CONTROLE || ' PRODUTO: ' || FN_LPAD(PRODUTO_ID, 6,0) || ' - ' || FN_ELIPSES(PRODUTO_DESCRICAO,30) || ' TAM.: ' || TAMANHO_DESCRICAO || ' - SITUACAO ' || SITUACAO_DESCRICAO || '. ERROS: ' || ERRO_ITEM || ' ' || FN_BREAK_LINE(1) || ' ';
        END

    END

    IF ( ERROS <> '' ) THEN
    BEGIN
        ERROS = 'HA DIVERGENCIAS DE INTEGRIDADE EM PEDIDOS. ' || FN_BREAK_LINE(1) || ERROS;

        IF ( FN_PARAMETRO('SISTEMA.PEDIDO_TIPO_ALERTA') = 0 ) THEN -- 0 =EXCEPTION; 1 = EMAIL; 2 = EXCEPTION E EMAIL
        BEGIN
            EXCEPTION "..." ERROS;
        END
        ELSE
        IF ( FN_PARAMETRO('SISTEMA.PEDIDO_TIPO_ALERTA') = 1 ) THEN -- 0 =EXCEPTION; 1 = EMAIL; 2 = EXCEPTION E EMAIL
        BEGIN
            EXECUTE PROCEDURE SPI_EMAIL(FN_PARAMETRO('SISTEMA.PEDIDO_EMAIL_ALERTA'),'INCONSISTENCIAS EM PEDIDOS',ERROS, null, 5);
        END
        ELSE
        IF ( FN_PARAMETRO('SISTEMA.PEDIDO_TIPO_ALERTA') = 2 ) THEN -- 0 =EXCEPTION; 1 = EMAIL; 2 = EXCEPTION E EMAIL
        BEGIN

            IN AUTONOMOUS TRANSACTION DO
            BEGIN
                EXECUTE PROCEDURE SPI_EMAIL(FN_PARAMETRO('SISTEMA.PEDIDO_EMAIL_ALERTA'),'INCONSISTENCIAS EM PEDIDOS',ERROS, null, 5);
            END

            EXCEPTION "..." ERROS;
        END
    END

end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SP_PEDIDO_ITEM_INTEGRIDADE_V2
as
declare variable DATA date;
declare variable DATA_ENTREGA date;
declare variable DATA_CLIENTE date;
declare variable DATA_PRODUCAO date;
declare variable PEDIDO integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(4000);
declare variable TAMANHO integer;
declare variable TAMANHO_DESCRICAO varchar(200);
declare variable QUANTIDADE numeric(18,5);
declare variable SITUACAO integer;
declare variable SITUACAO_DESCRICAO varchar(50);
declare variable CONTROLE integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QUANTIDADE_FATURAR numeric(18,5);
declare variable DIF numeric(18,5);
declare variable CHK_QTD_EST numeric(18,4);
declare variable CHK_QTD_REM numeric(18,4);
declare variable CHK_QTD_AGP numeric(18,4);
declare variable DIF_QTD_EST boolean;
declare variable DIF_QTD_AGP boolean;
declare variable DIF_QTD_REM boolean;
declare variable ERRO_ITEM blob sub_type 1 segment size 80 character set WIN1252;
declare variable ERROS blob sub_type 1 segment size 80 character set WIN1252;
begin

    ERROS = '';

    FOR
        SELECT
            DATA,
            DATA_ENTREGA,
            DATA_CLIENTE,
            DATA_PRODUCAO,
            PEDIDO,
            PRODUTO_ID,  
            FN_DESCRICAO('TBPRODUTO',X.PRODUTO_ID) PRODUTO_DESCRICAO,
            TAMANHO, 
            FN_TAMANHO_PRODUTO(X.PRODUTO_ID,X.TAMANHO) TAMANHO_DESCRICAO,
            QUANTIDADE,
            SITUACAO,
            CASE SITUACAO
            WHEN 1 THEN '01 - A FATURAR'
            WHEN 2 THEN '02 - FATURADO'
            WHEN 3 THEN '03 - ENCERRADO'
            END SITUACAO_DESCRICAO,
            CONTROLE,
            QTD_EST,
            QTD_AGP,
            QTD_REM,
            QUANTIDADE_FATURAR,
            DIF,
            CHK_QTD_EST,
            CHK_QTD_REM,
            CHK_QTD_AGP,
            IIF(QTD_EST <> CHK_QTD_EST,TRUE,FALSE) DIF_QTD_EST,
            IIF(QTD_AGP <> CHK_QTD_AGP,TRUE,FALSE) DIF_QTD_AGP,
            IIF(QTD_REM <> CHK_QTD_REM,TRUE,FALSE) DIF_QTD_REM
        
        FROM (
            SELECT
            P.DATA,
            P.DATA_ENTREGA,
            P.DATA_CLIENTE,
            P.DATA_PRODUCAO,
            I.PEDIDO,
            I.PRODUTO_CODIGO PRODUTO_ID,
            I.TAMANHO,
            I.QUANTIDADE,
            I.SITUACAO,
            I.CONTROLE,
            I.QTD_EST,
            I.QTD_AGP,
            I.QTD_REM,
            IIF(I.SITUACAO=1,S.QUANTIDADE,0) QUANTIDADE_FATURAR,
        
            IIF( IIF(I.SITUACAO=1,S.QUANTIDADE,0) - I.QTD_EST - I.QTD_REM - I.QTD_AGP < 0, IIF(I.SITUACAO=1,S.QUANTIDADE,0) - I.QTD_EST - I.QTD_REM - I.QTD_AGP, 0) DIF,
        
            COALESCE((SELECT SUM(A.SALDO)
                        FROM TBESTOQUE_DETALHE_ALOCACAO A
                       WHERE A.TABELA_ID = I.PEDIDO
                         AND A.TAB_ITEM_ID = I.CONTROLE
                         AND A.SALDO > 0
                         AND A.TIPO = 'P'),0) CHK_QTD_EST,
            
            COALESCE((SELECT SUM(B.SALDO)
                        FROM TBREMESSA_ITEM_ALOCACAO B
                       WHERE B.TABELA_ID = I.PEDIDO
                         AND B.TAB_ITEM_ID = I.CONTROLE
                         AND B.SALDO > 0
                         AND B.TABELA_ID > 0),0) CHK_QTD_REM,
        
        
            COALESCE((SELECT SUM(AGP.SALDO) FROM TBAGRUPAMENTO_PEDIDO AGP
                       WHERE AGP.TABELA_ID = I.PEDIDO
                         AND AGP.TAB_ITEM_ID = I.CONTROLE
                         AND AGP.TIPO = 'P'),0) CHK_QTD_AGP
        
            FROM
                TBPEDIDO P,
                TBPEDIDO_ITEM I,
                TBPEDIDO_ITEM_SALDO S
            
            WHERE TRUE
            AND P.DATA > DATEADD(-6 MONTH TO CURRENT_DATE)
            AND I.PEDIDO = P.PEDIDO
            AND S.PEDIDO = I.PEDIDO
            AND S.PEDIDO_ITEM_CONTROLE = I.CONTROLE
            AND P.CLASSIFICACAO = ' '    /* SÓ PEDIDOS DE BOJOS */
            ORDER BY I.PEDIDO,I.SEQUENCIA
        ) X
        
        WHERE TRUE
        AND (IIF(X.SITUACAO <> 1, X.CHK_QTD_EST > 0 OR X.CHK_QTD_AGP > 0 OR X.CHK_QTD_REM > 0, FALSE) -- VERIFICA SE HA SALDO DEPOIS DE FATURADO OU ENCERRADO
          OR IIF(X.SITUACAO  = 1,
                 DIF < 0  --VERIFICA SE HA DIVERGENCIA NA QUANTIDADE A PRODUZIR COM O PEDIDO EM ABERTO
              OR X.QTD_EST <> X.CHK_QTD_EST  --VERIFICA SE HA DIVERGENCIA NO ESTOQUE ALOCADO COM O PEDIDO EM ABERTO
              OR X.QTD_AGP <> X.CHK_QTD_AGP --VERIFICA SE HA DIVERGENCIA NO AGRUPAMENTO COM O PEDIDO EM ABERTO
              OR X.QTD_REM <> X.CHK_QTD_REM --VERIFICA SE HA DIVERGENCIA EM REMESSAS COM O PEDIDO EM ABERTO
              , FALSE))
    INTO
        DATA,
        DATA_ENTREGA,
        DATA_CLIENTE,
        DATA_PRODUCAO,
        PEDIDO,
        PRODUTO_ID,
        PRODUTO_DESCRICAO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        QUANTIDADE,
        SITUACAO,
        SITUACAO_DESCRICAO,
        CONTROLE,
        QTD_EST,
        QTD_AGP,
        QTD_REM,
        QUANTIDADE_FATURAR,
        DIF,
        CHK_QTD_EST,
        CHK_QTD_REM,
        CHK_QTD_AGP,
        DIF_QTD_EST,
        DIF_QTD_AGP,
        DIF_QTD_REM

--        PRODUTO_DESCRICAO,
--        TAMANHO_DESCRICAO,
--        DATA,
--        DATA_ENTREGA,
--        DATA_CLIENTE,
--        DATA_PRODUCAO,
--        PEDIDO,
--        PRODUTO_ID,
--        TAMANHO,
--        QUANTIDADE,
--        SITUACAO,
--        SITUACAO_DESCRICAO,
--        CONTROLE,
--        QTD_EST,
--        QTD_AGP,
--        QTD_REM,
--        QUANTIDADE_FATURAR,
--        DIF,
--        CHK_QTD_EST,
--        CHK_QTD_REM,
--        CHK_QTD_AGP,
--        DIF_QTD_EST,
--        DIF_QTD_AGP,
--        DIF_QTD_REM
    DO
    BEGIN
        ERRO_ITEM = '';

        IF ( SITUACAO <> 1 AND CHK_QTD_EST > 0 ) THEN
        BEGIN
            ERRO_ITEM = 'COM ESTOQUE ALOCADO. QTD: ' || CHK_QTD_EST;
        END

        IF ( SITUACAO <> 1 AND CHK_QTD_AGP > 0 ) THEN
        BEGIN                                        
            ERRO_ITEM = 'COM QUANTIDADE EM AGRUPAMENTO. QTD: ' || CHK_QTD_AGP;
        END

        IF ( SITUACAO <> 1 AND CHK_QTD_REM > 0 ) THEN
        BEGIN                                              
            ERRO_ITEM = 'COM TALOES GERADOS. QTD: ' || CHK_QTD_REM;
        END    

        IF ( SITUACAO = 1 AND DIF < 0 ) THEN
        BEGIN
            ERRO_ITEM = 'DIVERGENCIA DE QUANTIDADE ALOCADA EM RELACAO A FATURAR. QTD A FATURAR: ' || QUANTIDADE_FATURAR || ' DIFERENCA ALOCADA: ' || (DIF * -1);
        END

--        IF ( SITUACAO = 1 AND QTD_EST <> CHK_QTD_EST ) THEN
--        BEGIN                           
--            ERRO_ITEM = 'DIVERGENCIA NO SOMATORIO DE ESTOQUE ALOCADO. QTD NO ITEM: ' || QTD_EST || ' QTD NOS REGISTROS: ' || CHK_QTD_EST;
--        END
--
--        IF ( SITUACAO = 1 AND QTD_AGP <> CHK_QTD_AGP ) THEN
--        BEGIN
--            ERRO_ITEM = 'DIVERGENCIA NO AGRUPAMENTO. QTD NO ITEM: ' || QTD_AGP || ' QTD NOS REGISTROS: ' || CHK_QTD_AGP;
--        END
--
--        IF ( SITUACAO = 1 AND QTD_REM <> CHK_QTD_REM ) THEN
--        BEGIN
--            ERRO_ITEM = 'DIVERGENCIA NA QUANTIDADE EM REMESSA. QTD NO ITEM: ' || QTD_REM || ' QTD NOS REGISTROS: ' || CHK_QTD_REM;
--        END

        IF ( ERRO_ITEM <> '' ) THEN
        BEGIN
            ERROS = ERROS || 'PEDIDO: ' || PEDIDO || ' ITEM CONTROLE: ' || CONTROLE || ' PRODUTO: ' || FN_LPAD(PRODUTO_ID, 6,0) || ' - ' || FN_ELIPSES(PRODUTO_DESCRICAO,30) || ' TAM.: ' || TAMANHO_DESCRICAO || ' - SITUACAO ' || SITUACAO_DESCRICAO || '. ERROS: ' || ERRO_ITEM || ' ' || FN_LINE(1,'<br/>') || ' ';
        END

    END

    IF ( ERROS <> '' ) THEN
    BEGIN
        ERROS = 'HA DIVERGENCIAS DE INTEGRIDADE EM PEDIDOS. ' || FN_LINE(1,'<br/>') || ERROS;

        IF ( FN_PARAMETRO('SISTEMA.PEDIDO_TIPO_ALERTA') <> 0 ) THEN -- 0 =EXCEPTION; 1 = EMAIL; 2 = EXCEPTION E EMAIL
        BEGIN

            IN AUTONOMOUS TRANSACTION DO
            BEGIN
                EXECUTE PROCEDURE SPI_EMAIL(FN_PARAMETRO('SISTEMA.PEDIDO_EMAIL_ALERTA'),'INCONSISTENCIAS EM PEDIDOS',ERROS, null, 5);
            END
    
            EXCEPTION "..." 'HA DIVERGENCIAS DE INTEGRIDADE EM PEDIDOS. ENTRE EM CONTATO COM SUPORTE TECNICO.';
        END

    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_PEDIDO_ITEM_INTEGRIDADE_V3
as
declare variable DATA date;
declare variable DATA_ENTREGA date;
declare variable DATA_CLIENTE date;
declare variable DATA_PRODUCAO date;
declare variable PEDIDO integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(4000);
declare variable TAMANHO integer;
declare variable TAMANHO_DESCRICAO varchar(200);
declare variable QUANTIDADE numeric(18,5);
declare variable SITUACAO integer;
declare variable SITUACAO_DESCRICAO varchar(50);
declare variable CONTROLE integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QUANTIDADE_FATURAR numeric(18,5);
declare variable DIF numeric(18,5);
declare variable CHK_QTD_EST numeric(18,4);
declare variable CHK_QTD_REM numeric(18,4);
declare variable CHK_QTD_AGP numeric(18,4);
declare variable DIF_QTD_EST boolean;
declare variable DIF_QTD_AGP boolean;
declare variable DIF_QTD_REM boolean;
declare variable ERRO_ITEM blob sub_type 1 segment size 80 character set WIN1252;
declare variable ERROS blob sub_type 1 segment size 80 character set WIN1252;
begin

    ERROS = '';

    FOR
        SELECT
            DATA,
            DATA_ENTREGA,
            DATA_CLIENTE,
            DATA_PRODUCAO,
            PEDIDO,
            PRODUTO_ID,  
            FN_DESCRICAO('TBPRODUTO',X.PRODUTO_ID) PRODUTO_DESCRICAO,
            TAMANHO, 
            FN_TAMANHO_PRODUTO(X.PRODUTO_ID,X.TAMANHO) TAMANHO_DESCRICAO,
            QUANTIDADE,
            SITUACAO,
            CASE SITUACAO
            WHEN 1 THEN '01 - A FATURAR'
            WHEN 2 THEN '02 - FATURADO'
            WHEN 3 THEN '03 - ENCERRADO'
            END SITUACAO_DESCRICAO,
            CONTROLE,
            QTD_EST,
            QTD_AGP,
            QTD_REM,
            QUANTIDADE_FATURAR,
            DIF,
            CHK_QTD_EST,
            CHK_QTD_REM,
            CHK_QTD_AGP,
            IIF(QTD_EST <> CHK_QTD_EST,TRUE,FALSE) DIF_QTD_EST,
            IIF(QTD_AGP <> CHK_QTD_AGP,TRUE,FALSE) DIF_QTD_AGP,
            IIF(QTD_REM <> CHK_QTD_REM,TRUE,FALSE) DIF_QTD_REM
        
        FROM (
            SELECT
            P.DATA,
            P.DATA_ENTREGA,
            P.DATA_CLIENTE,
            P.DATA_PRODUCAO,
            I.PEDIDO,
            I.PRODUTO_CODIGO PRODUTO_ID,
            I.TAMANHO,
            I.QUANTIDADE,
            I.SITUACAO,
            I.CONTROLE,
            I.QTD_EST,
            I.QTD_AGP,
            I.QTD_REM,
            IIF(I.SITUACAO=1,S.QUANTIDADE,0) QUANTIDADE_FATURAR,
        
            IIF( IIF(I.SITUACAO=1,S.QUANTIDADE,0) - I.QTD_EST - I.QTD_REM - I.QTD_AGP < 0, IIF(I.SITUACAO=1,S.QUANTIDADE,0) - I.QTD_EST - I.QTD_REM - I.QTD_AGP, 0) DIF,
        
            COALESCE((SELECT SUM(A.SALDO)
                        FROM TBESTOQUE_DETALHE_ALOCACAO A
                       WHERE A.TABELA_ID = I.PEDIDO
                         AND A.TAB_ITEM_ID = I.CONTROLE
                         AND A.SALDO > 0
                         AND A.TIPO = 'P'),0) CHK_QTD_EST,
            
            COALESCE((SELECT SUM(B.SALDO)
                        FROM TBREMESSA_ITEM_ALOCACAO B
                       WHERE B.TABELA_ID = I.PEDIDO
                         AND B.TAB_ITEM_ID = I.CONTROLE
                         AND B.SALDO > 0
                         AND B.TABELA_ID > 0),0) CHK_QTD_REM,
        
        
            COALESCE((SELECT SUM(AGP.SALDO) FROM TBAGRUPAMENTO_PEDIDO AGP
                       WHERE AGP.TABELA_ID = I.PEDIDO
                         AND AGP.TAB_ITEM_ID = I.CONTROLE
                         AND AGP.TIPO = 'P'),0) CHK_QTD_AGP
        
            FROM
                TBPEDIDO P,
                TBPEDIDO_ITEM I,
                TBPEDIDO_ITEM_SALDO S
            
            WHERE TRUE
            AND P.DATA > DATEADD(-6 MONTH TO CURRENT_DATE)
            AND I.PEDIDO = P.PEDIDO
            AND S.PEDIDO = I.PEDIDO
            AND S.PEDIDO_ITEM_CONTROLE = I.CONTROLE
            AND P.CLASSIFICACAO = ' '    /* SÓ PEDIDOS DE BOJOS */
            --and i.produto_codigo <> 100432
            ORDER BY I.PEDIDO,I.SEQUENCIA
        ) X
        
        WHERE TRUE
        AND (IIF(X.SITUACAO <> 1, X.CHK_QTD_EST > 0 OR X.CHK_QTD_AGP > 0 OR X.CHK_QTD_REM > 0, FALSE) -- VERIFICA SE HA SALDO DEPOIS DE FATURADO OU ENCERRADO
          OR IIF(X.SITUACAO  = 1,
                 DIF < 0  --VERIFICA SE HA DIVERGENCIA NA QUANTIDADE A PRODUZIR COM O PEDIDO EM ABERTO
              OR X.QTD_EST <> X.CHK_QTD_EST  --VERIFICA SE HA DIVERGENCIA NO ESTOQUE ALOCADO COM O PEDIDO EM ABERTO
              OR X.QTD_AGP <> X.CHK_QTD_AGP --VERIFICA SE HA DIVERGENCIA NO AGRUPAMENTO COM O PEDIDO EM ABERTO
              OR X.QTD_REM <> X.CHK_QTD_REM --VERIFICA SE HA DIVERGENCIA EM REMESSAS COM O PEDIDO EM ABERTO
              , FALSE))
    INTO
        DATA,
        DATA_ENTREGA,
        DATA_CLIENTE,
        DATA_PRODUCAO,
        PEDIDO,
        PRODUTO_ID,
        PRODUTO_DESCRICAO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        QUANTIDADE,
        SITUACAO,
        SITUACAO_DESCRICAO,
        CONTROLE,
        QTD_EST,
        QTD_AGP,
        QTD_REM,
        QUANTIDADE_FATURAR,
        DIF,
        CHK_QTD_EST,
        CHK_QTD_REM,
        CHK_QTD_AGP,
        DIF_QTD_EST,
        DIF_QTD_AGP,
        DIF_QTD_REM

--        PRODUTO_DESCRICAO,
--        TAMANHO_DESCRICAO,
--        DATA,
--        DATA_ENTREGA,
--        DATA_CLIENTE,
--        DATA_PRODUCAO,
--        PEDIDO,
--        PRODUTO_ID,
--        TAMANHO,
--        QUANTIDADE,
--        SITUACAO,
--        SITUACAO_DESCRICAO,
--        CONTROLE,
--        QTD_EST,
--        QTD_AGP,
--        QTD_REM,
--        QUANTIDADE_FATURAR,
--        DIF,
--        CHK_QTD_EST,
--        CHK_QTD_REM,
--        CHK_QTD_AGP,
--        DIF_QTD_EST,
--        DIF_QTD_AGP,
--        DIF_QTD_REM
    DO
    BEGIN
        ERRO_ITEM = '';

        IF ( SITUACAO <> 1 AND CHK_QTD_EST > 0 ) THEN
        BEGIN
            ERRO_ITEM = 'COM ESTOQUE ALOCADO. QTD: ' || coalesce(CHK_QTD_EST,0);
        END

        IF ( SITUACAO <> 1 AND CHK_QTD_AGP > 0 ) THEN
        BEGIN                                        
            ERRO_ITEM = 'COM QUANTIDADE EM AGRUPAMENTO. QTD: ' || coalesce(CHK_QTD_AGP,0);
        END

        IF ( SITUACAO <> 1 AND CHK_QTD_REM > 0 ) THEN
        BEGIN                                              
            ERRO_ITEM = 'COM TALOES GERADOS. QTD: ' || coalesce(CHK_QTD_REM,0);
        END    

        IF ( SITUACAO = 1 AND DIF < 0 ) THEN
        BEGIN
            ERRO_ITEM = 'DIVERGENCIA DE QUANTIDADE ALOCADA EM RELACAO A FATURAR. QTD A FATURAR: ' || coalesce(QUANTIDADE_FATURAR,0) || ' DIFERENCA ALOCADA: ' || (DIF * -1);
        END

--        IF ( SITUACAO = 1 AND QTD_EST <> CHK_QTD_EST ) THEN
--        BEGIN                           
--            ERRO_ITEM = 'DIVERGENCIA NO SOMATORIO DE ESTOQUE ALOCADO. QTD NO ITEM: ' || QTD_EST || ' QTD NOS REGISTROS: ' || CHK_QTD_EST;
--        END
--
--        IF ( SITUACAO = 1 AND QTD_AGP <> CHK_QTD_AGP ) THEN
--        BEGIN
--            ERRO_ITEM = 'DIVERGENCIA NO AGRUPAMENTO. QTD NO ITEM: ' || QTD_AGP || ' QTD NOS REGISTROS: ' || CHK_QTD_AGP;
--        END
--
--        IF ( SITUACAO = 1 AND QTD_REM <> CHK_QTD_REM ) THEN
--        BEGIN
--            ERRO_ITEM = 'DIVERGENCIA NA QUANTIDADE EM REMESSA. QTD NO ITEM: ' || QTD_REM || ' QTD NOS REGISTROS: ' || CHK_QTD_REM;
--        END

        IF ( ERRO_ITEM <> '' ) THEN
        BEGIN
            ERROS = ERROS || 'PEDIDO: ' || coalesce( PEDIDO , 0) || ' ITEM CONTROLE: ' || coalesce(CONTROLE,0) || ' PRODUTO: ' || coalesce(FN_LPAD(PRODUTO_ID, 6,0),0) || ' - ' || coalesce(FN_ELIPSES(PRODUTO_DESCRICAO,30),'') || ' TAM.: ' || coalesce(TAMANHO_DESCRICAO,'') || ' - SITUACAO ' || coalesce(SITUACAO_DESCRICAO,'') || '. ERROS: ' || coalesce(ERRO_ITEM,'') || ' ' || FN_LINE(1,'<br/>') || ' ';
        END

    END

    IF ( ERROS <> '' ) THEN
    BEGIN
        ERROS = 'HA DIVERGENCIAS DE INTEGRIDADE EM PEDIDOS. ' || FN_LINE(1,'<br/>') || coalesce(ERROS,' NULL ');

        IF ( FN_PARAMETRO('SISTEMA.PEDIDO_TIPO_ALERTA') <> 0 ) THEN -- 0 =EXCEPTION; 1 = EMAIL; 2 = EXCEPTION E EMAIL
        BEGIN

            IN AUTONOMOUS TRANSACTION DO
            BEGIN
                EXECUTE PROCEDURE SPI_EMAIL(FN_PARAMETRO('SISTEMA.PEDIDO_EMAIL_ALERTA'),'INCONSISTENCIAS EM PEDIDOS',ERROS, null, 5);
            END
    
            EXCEPTION "..." 'HA DIVERGENCIAS DE INTEGRIDADE EM PEDIDOS. ENTRE EM CONTATO COM SUPORTE TECNICO.';
        END

    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICAR (
    HORA timestamp,
    USUARIO_ID varchar(500),
    ASSUNTO varchar(500),
    CORPO blob sub_type 1 segment size 80,
    EMAIL integer = 1,
    NOTIFICACAO integer = 1,
    MODULO_EMAIL integer = 0)
as
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(100);
BEGIN

    DESTINATARIO = (SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID);

    IF ( NOTIFICACAO = 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,
            :USUARIO_ID,
            0,
            0,
            COALESCE(:ASSUNTO,'NOVO EMAIL'),
            0,
            0,
            :HORA,
            :USUARIO_ID,
            :HORA,
            0,
            '',
            0,
            COALESCE(:CORPO,'')
        );

    END

    IF ( EMAIL = 1 ) THEN
    BEGIN

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

        INSERT INTO TBEMAIL (
            ID,
            EMAIL,
            USUARIO_ID,
            ASSUNTO,
            CORPO,
            STATUS,
            DATAHORA,
            MODULO_EMAIL
        ) VALUES (
            :EMAIL_ID,
            :DESTINATARIO,
            0,
            COALESCE(:ASSUNTO,'NOVO EMAIL'),
            COALESCE(:CORPO,''),
            0,
            :HORA,
            :MODULO_EMAIL
        );
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_MODELO_VALIDACAO_NOTIF (
    USUARIOS varchar(100),
    TITULO varchar(1000),
    FAMILIA_ID integer)
as
declare variable VMODELO integer;
declare variable MODELO_ID integer;
declare variable MODELO_DESCRICAO varchar(100);
declare variable MODULO varchar(20);
declare variable TABELA varchar(50);
declare variable CAMPO varchar(20);
declare variable CONDICAO_VALIDA varchar(100);
declare variable TABELA_VALIDACAO varchar(50);
declare variable CAMPO_VALIDACAO varchar(50);
declare variable VALOR_VALIDACAO varchar(20);
declare variable VALOR_VALIDACAO_MINIMO varchar(20);
declare variable VALOR_VALIDACAO_MAXIMO varchar(20);
declare variable CONDICAO_INTERNA varchar(1000);
declare variable CONDICAO_EXTERNA varchar(1000);
declare variable VVALOR1 varchar(100);
declare variable VVALOR2 varchar(100);
declare variable VPRODUTO varchar(100);
declare variable MENSAGEM_ERRO varchar(200);
declare variable ERROS integer;
declare variable TOTAL_ERROS integer;
declare variable VPENDENCIAS varchar(1000);
declare variable MENSAGEM blob sub_type 0 segment size 80;
declare variable USUARIO_ID integer;
declare variable EMAIL varchar(1000);
BEGIN

  MENSAGEM = '';
  vModelo  = 0;
  Total_Erros = 0;

  FOR /*select first 200 distinct m.codigo, m.descricao
        from tbmodelo m, tbmodelo_validacao v, tbestoque_saldo_diario a, tbproduto p
       where m.status = '1'
         and m.codigo = v.modelo_id
         and m.familia_codigo = :familia_id
         and v.status = '0'
         and v.notificacao = '1'
         and p.codigo = a.produto_codigo
         and a.saldo > 0
         and p.modelo_codigo = m.codigo
         union    */
      select first 500 m.codigo, m.descricao
        from tbmodelo m, tbmodelo_validacao v
       where m.status = '1'
         and m.codigo = v.modelo_id
         and m.familia_codigo = :familia_id
         and v.status = '0'
         and v.notificacao = '1'
       /*  and m.data >= CURRENT_DATE - 30 */
  INTO :MODELO_ID, :MODELO_DESCRICAO
  DO BEGIN

  Erros = 0;

   FOR
   SELECT --ID,
          MODULO,
          TABELA,
          CAMPO,
          CONDICAO_VALIDA,
          TABELA_VALIDACAO,
          CAMPO_VALIDACAO,
          VALOR_VALIDACAO,
          CONDICAO_INTERNA,
          CONDICAO_EXTERNA,
          COALESCE(VALOR_VALIDACAO_MINIMO,''),
          COALESCE(VALOR_VALIDACAO_MAXIMO,''),
          --OBSERVACAO,
          MENSAGEM_ERRO
     FROM TBCADASTRO_REGRA CR
    WHERE CADASTRO = 'MODELOS'
      AND FAMILIA_ID = :FAMILIA_ID
      AND STATUS = '1'
     INTO --:ID,
          :MODULO,
          :TABELA,
          :CAMPO,
          :CONDICAO_VALIDA,
          :TABELA_VALIDACAO,
          :CAMPO_VALIDACAO,
          :VALOR_VALIDACAO,
          :CONDICAO_INTERNA,
          :CONDICAO_EXTERNA,
          :VALOR_VALIDACAO_MINIMO,
          :VALOR_VALIDACAO_MAXIMO,
          --:OBSERVACAO,
          :MENSAGEM_ERRO
       DO BEGIN

             if (:CAMPO = 'CODIGO') then
                BEGIN
                :CAMPO = :MODELO_ID;
                END

            :VVALOR1 = '0';
            :VVALOR2 = '0';

            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<CAMPO_VALIDACAO>',:CAMPO_VALIDACAO);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<TABELA>',:TABELA);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<CAMPO>',:CAMPO);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<CAMPO_VALIDACAO>',:CAMPO_VALIDACAO);
            :CONDICAO_INTERNA = REPLACE(:CONDICAO_INTERNA,'<VALOR_VALIDACAO>',:VALOR_VALIDACAO);

            EXECUTE STATEMENT :CONDICAO_INTERNA INTO :VVALOR1;

            if (:CONDICAO_VALIDA = 'SQL') then
                Begin

                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<TABELA>',:TABELA);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<TABELA_VALIDACAO>',:TABELA_VALIDACAO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<VALOR_VALIDACAO>',:VALOR_VALIDACAO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<CONDICAO_INTERNA>',:VVALOR1);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<CAMPO>',:CAMPO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<CAMPO_VALIDACAO>',:CAMPO_VALIDACAO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<VALOR_VALIDACAO_MINIMO>',:VALOR_VALIDACAO_MINIMO);
                :CONDICAO_EXTERNA = REPLACE(:CONDICAO_EXTERNA,'<VALOR_VALIDACAO_MAXIMO>',:VALOR_VALIDACAO_MAXIMO);

                EXECUTE STATEMENT :CONDICAO_EXTERNA INTO :VVALOR2,:vPRODUTO;
    
                if (:VVALOR2 = '0') then
                    BEGIN
                    if (vModelo <> Modelo_Id) Then
                        begin
                        MENSAGEM = MENSAGEM ||'<br>';
                        MENSAGEM = MENSAGEM ||FN_REMOVE_ACENTOS('MODELO: '||LPAD(:MODELO_ID,5,'0')||'-'||modelo_descricao);
                        MENSAGEM = MENSAGEM ||'<br>';
                        end

                    vModelo = :Modelo_Id;
                    vPendencias = ' MODULO: '||MODULO||' -> ('||CAMPO_VALIDACAO||') '||:vPRODUTO||' -> '||FN_REMOVE_ACENTOS(MENSAGEM_ERRO);--||'-'||VALOR_VALIDACAO_MINIMO||'-'||VALOR_VALIDACAO_MAXIMO);

                    MENSAGEM = MENSAGEM || vPendencias ||'<br>';
                    erros = erros + 1;
                    Total_Erros = Total_Erros + 1;
                    --Suspend;
                    END

                End else

            if (:CONDICAO_VALIDA = 'VALOR') then
                Begin

                if (POSITION('#'||:VVALOR1||'#',:CONDICAO_EXTERNA) = 0) then
                    BEGIN
                    if (vModelo <> Modelo_Id) Then
                        begin
                        MENSAGEM = MENSAGEM ||'<br>';
                        MENSAGEM = MENSAGEM ||FN_REMOVE_ACENTOS('MODELO: '||LPAD(:MODELO_ID,5,'0')||'-'||modelo_descricao);
                        MENSAGEM = MENSAGEM ||'<br>';
                        end

                    vModelo = :Modelo_Id;
                    vPendencias = FN_REMOVE_ACENTOS(' MODULO: '||MODULO||'  -> '||MENSAGEM_ERRO);--||'-'||VALOR_VALIDACAO_MINIMO||'-'||VALOR_VALIDACAO_MAXIMO);

                    MENSAGEM = MENSAGEM || vPendencias ||'<br>';
                    erros = erros + 1;
                    Total_Erros = Total_Erros + 1;
                    --Suspend;
                    END

                End 

          END

      if (Erros = 0) then
          begin
            in autonomous transaction do
               begin
               Update tbmodelo_validacao set Status = '1' where modelo_id = :Modelo_Id;
               End
          end else
          begin
            vPendencias = FN_REMOVE_ACENTOS(' -----------------------> NR. DE ERROS: '||:ERROS);
            MENSAGEM = MENSAGEM || vPendencias ||'<br>';
          end

      END

  if (Total_Erros > 0) then
      Begin
          For
          Select U.Codigo, Email
          From TbUsuario U
          Where U.Codigo in (select OSPLIT from split(:usuarios,','))
          Into :Usuario_Id, :Email
          Do begin
        
            in autonomous transaction do
               begin
               INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO, MODULO_EMAIL)
               VALUES (:EMAIL, 0, :TITULO, 0, current_timestamp,:MENSAGEM, 18);
                    
               EXECUTE PROCEDURE SPI_NOTIFICAR(CURRENT_TIMESTAMP,:USUARIO_ID,:TITULO, TOTAL_ERROS||' ERROS ENCONTRADOS NO CADASTRO DE MODELOS, AS PENDENCIAS FORAM ENVIADAS POR E-MAIL, FAVOR VERIFICAR!',0,1,18);
               End

             End
      End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_CLIENTES_SEMPEDVIS (
    ASSUNTO varchar(500),
    MENSAGEM varchar(500),
    REPRESENTANTE_DESTINO integer,
    SITUACAO_DESTINO integer,
    USUARIOS_EXTRAS varchar(100),
    CNEGOCIO integer,
    DIAS integer,
    PERFIS_PEDIDOS varchar(100))
as
declare variable REPRESENTANTE_ID integer;
declare variable REPRESENTANTE varchar(50);
declare variable CLIENTE_ID integer;
declare variable CLIENTES varchar(4000);
declare variable CLIENTES_IDS varchar(500);
declare variable GRUPOS_IDS varchar(500);
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable USUARIO_ID integer;
begin

    IF(:USUARIOS_EXTRAS <> '') THEN
       BEGIN
        INSERT INTO TMPGERAL2 (INTEIRO_01)
        SELECT OSPLIT
          FROM SPLIT( :USUARIOS_EXTRAS, ',' );
       END

    IF(:PERFIS_PEDIDOS <> '') THEN
       BEGIN
        INSERT INTO TMPGERAL3 (TEXTO_01) VALUES (' ');

        INSERT INTO TMPGERAL3 (TEXTO_01)
        SELECT OSPLIT
          FROM SPLIT( :PERFIS_PEDIDOS, ',' );
       END

    For
    SELECT
    REPRESENTANTE_ID,
    REPRESENTANTE,
    LIST(DISTINCT CLIENTE,'<br>') as CLIENTES,
    LIST(DISTINCT CLIENTE_ID) as CLIENTES_IDS,
    LIST(DISTINCT GRUPO_ID) as GRUPOS_IDS
    FROM (
            SELECT
            REPRESENTANTE_ID,
            REPRESENTANTE,
            CLIENTE,
            GRUPO_ID,
            CLIENTE_ID
            FROM (
                    SELECT
                    REPRESENTANTE_ID,
                    (SELECT FIRST 1 R.NOMEFANTASIA||'/'||R.UF FROM TBEMPRESA R WHERE R.CODIGO = X.REPRESENTANTE_ID) AS REPRESENTANTE,
                    IIF(GRUPO_ID > 0,
                    (SELECT FIRST 1 'GRUPO '||EG.DESCRICAO||'/'||EG.UF FROM TBEMPRESA_GRUPO EG WHERE EG.ID = X.GRUPO_ID),
                    (SELECT FIRST 1 C.RAZAOSOCIAL||'/'||C.UF FROM TBEMPRESA C WHERE C.CODIGO = X.CLIENTE_ID)) AS CLIENTE,
                    GRUPO_ID,
                    CLIENTE_ID,
                    
                    IIF(CLIENTE_ID > 0,
                       (SELECT MAX(P.DATA_CLIENTE) FROM TBPEDIDO P, TBPEDIDO_ITEM PI, TMPGERAL3 T
                         WHERE P.CLIENTE_CODIGO = X.CLIENTE_ID 
                           AND CAST(P.DATA_CLIENTE AS DATE) >= CURRENT_DATE - CAST( :DIAS AS INTEGER)
                           AND P.PEDIDO = PI.PEDIDO
                           AND P.CLASSIFICACAO = T.TEXTO_01
                           AND PI.SITUACAO < 3),
                       /*  GRUPO */
                       (SELECT MAX(P.DATA_CLIENTE) FROM TBPEDIDO P, TBPEDIDO_ITEM PI, TBEMPRESA_GRUPO_CONTAS EGC, TMPGERAL3 T
                         WHERE P.CLIENTE_CODIGO = EGC.EMPRESA_ID
                           AND EGC.EMPRESA_GRUPO_ID = X.GRUPO_ID
                           AND CAST(P.DATA_CLIENTE AS DATE) >= CURRENT_DATE - CAST( :DIAS AS INTEGER)
                           AND P.PEDIDO = PI.PEDIDO
                           AND P.CLASSIFICACAO = T.TEXTO_01
                           AND PI.SITUACAO < 3)) AS ULTIMO_PEDIDO,
                    
                    IIF(CLIENTE_ID > 0,
                       (SELECT MAX(CAST(V.DATAHORA AS DATE)) FROM TBREGISTRO_VISITA V
                         WHERE V.CLIENTE_ID = X.CLIENTE_ID AND V.STATUSEXCLUSAO = '0'
                           AND CAST(V.DATAHORA AS DATE) >= CURRENT_DATE - CAST( :DIAS AS INTEGER) ),
                       /*  GRUPO */
                       (SELECT MAX(CAST(V.DATAHORA AS DATE)) FROM TBREGISTRO_VISITA V, TBEMPRESA_GRUPO_CONTAS EGC
                         WHERE V.CLIENTE_ID = EGC.EMPRESA_ID
                           AND EGC.EMPRESA_GRUPO_ID = X.GRUPO_ID
                           AND V.STATUSEXCLUSAO = '0'
                           AND CAST(V.DATAHORA AS DATE) >= CURRENT_DATE - CAST( :DIAS AS INTEGER) )) AS ULTIMA_VISITA
                    
                    FROM (
                            SELECT
                            REPRESENTANTE_ID,
                            GRUPO_ID AS GRUPO_ID,
                            CLIENTE_ID AS CLIENTE_ID,
                            MAX(DATA_CADASTRO) AS DATA_CADASTRO
                            FROM (
                                    SELECT
                                    REPRESENTANTE_ID, 
                                    IIF(GRUPO_ID > 0, GRUPO_ID, 0) AS GRUPO_ID,
                                    IIF(GRUPO_ID > 0, 0, CLIENTE_ID) AS CLIENTE_ID,
                                    DATA_CADASTRO
                                    FROM (
                                            SELECT
                                                B.REPRESENTANTE_CODIGO AS REPRESENTANTE_ID,
                                                E.CODIGO AS CLIENTE_ID,
                                                COALESCE(
                                               (SELECT FIRST 1 EG.ID FROM TBEMPRESA_GRUPO EG, TBEMPRESA_GRUPO_CONTAS EGC WHERE EG.ID = EGC.EMPRESA_GRUPO_ID AND EGC.EMPRESA_ID = E.CODIGO),0) AS GRUPO_ID,
                                                E.DATA AS DATA_CADASTRO
                                            --  CURRENT_DATE - CAST( :DIAS AS INTEGER) AS DATABASE
                                            
                                             FROM TBEMPRESA E,
                                                  TBCLIENTE B, 
                                                  TBCENTRO_NEGOCIO_REPRE CN
                                            WHERE E.CODIGO = B.CODIGO 
                                              AND B.REPRESENTANTE_CODIGO = CN.REPRESENTANTE_ID 
                                              AND CN.CENTRO_NEGOCIO_ID = :CNEGOCIO
                                              AND E.STATUS = '1'
                                              AND E.CODIGO <> B.REPRESENTANTE_CODIGO
                                              AND B.REPRESENTANTE_CODIGO <> :REPRESENTANTE_DESTINO
                                           ) X
                                    ) X
                            GROUP BY REPRESENTANTE_ID, GRUPO_ID, CLIENTE_ID
                           ) X
                    WHERE X.DATA_CADASTRO < CURRENT_DATE - CAST( :DIAS AS INTEGER)
                  ) X
            WHERE TRUE
              AND ULTIMO_PEDIDO IS NULL
              AND ULTIMA_VISITA IS NULL
            
            ORDER BY
              REPRESENTANTE,
              CLIENTE
           ) X
   GROUP BY REPRESENTANTE, REPRESENTANTE_ID

   
    into
        :REPRESENTANTE_ID,
        :REPRESENTANTE,
        :CLIENTES,
        :CLIENTES_IDS,
        :GRUPOS_IDS

    do begin
   
        -- ASSUNTO = 'Clientes sem Pedidos e sem Visitas nos Ultimos 30 dias';
        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p>'||:MENSAGEM||'</p>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"></p>';
        corpo1 = corpo1 || '<p><b>'||:REPRESENTANTE||'</b></p>';
        corpo1 = corpo1 || '<p>'||:CLIENTES||'</p>';
        corpo1 = corpo1 || '</body></html>';

            FOR
                SELECT U.CODIGO
                  FROM TBUSUARIO U, TBUSUARIO_REPRESENTANTE R
                 WHERE U.CODIGO = R.USUARIO_CODIGO
                   AND U.STATUS = '1'
                   AND R.REPRESENTANTE_CODIGO = :REPRESENTANTE_ID
            INTO 
                :USUARIO_ID
            DO BEGIN
                  EXECUTE PROCEDURE SPI_NOTIFICAR(
                  CURRENT_TIMESTAMP,
                  :USUARIO_ID,
                  :ASSUNTO,
                  :CORPO1,
                  1,
                  1,
                  5
                  );
               END

        IF(:USUARIOS_EXTRAS <> '') THEN
            BEGIN
                FOR
                SELECT INTEIRO_01
                  FROM TMPGERAL2
                INTO :USUARIO_ID
                  DO BEGIN
                      EXECUTE PROCEDURE SPI_NOTIFICAR(
                      CURRENT_TIMESTAMP,
                      :USUARIO_ID,
                      :ASSUNTO,
                      :CORPO1,
                      1,
                      1,
                      5
                      );
                   END
            END

        corpo1 = '';
        IF ((REPRESENTANTE_DESTINO > 0) AND (SITUACAO_DESTINO > 0)) THEN
            BEGIN
                INSERT INTO TMPGERAL (INTEIRO_01)
                SELECT OSPLIT
                  FROM SPLIT( :CLIENTES_IDS, ',' );
                
                FOR 
                SELECT INTEIRO_01
                  FROM TMPGERAL
                INTO :CLIENTE_ID
                  DO BEGIN
                       UPDATE TBCLIENTE SET REPRESENTANTE_CODIGO = :REPRESENTANTE_DESTINO, CLIENTE_SITUACAO_ID  = :SITUACAO_DESTINO WHERE CODIGO = :CLIENTE_ID;
                     END

               DELETE FROM TMPGERAL;

                INSERT INTO TMPGERAL (INTEIRO_01)
                SELECT OSPLIT
                  FROM SPLIT( :GRUPOS_IDS, ',' );
                
                FOR 
                SELECT EGC.EMPRESA_ID
                  FROM TMPGERAL T, TBEMPRESA_GRUPO_CONTAS EGC
                 WHERE T.INTEIRO_01 = EGC.EMPRESA_GRUPO_ID
                INTO :CLIENTE_ID
                  DO BEGIN
                       UPDATE TBCLIENTE SET REPRESENTANTE_CODIGO = :REPRESENTANTE_DESTINO, CLIENTE_SITUACAO_ID  = :SITUACAO_DESTINO WHERE CODIGO = :CLIENTE_ID;
                     END

               DELETE FROM TMPGERAL;

             END
        
       End

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_FORMULARIO
returns (
    TITULO varchar(100),
    TEMPO varchar(255),
    PERIODO_INI date,
    PERIODO_FIM date,
    USUARIO_ID integer,
    EMAIL varchar(100),
    USUARIO blob sub_type 1 segment size 100,
    ID integer)
as
declare variable CORPO blob sub_type 1 segment size 80;
begin


  for
    select
        f.id,
        f.titulo,
        fn_time_humanize(datediff(minute, current_timestamp, f.periodo_fim) + 0.01) as TEMPO,
        f.periodo_ini,
        f.periodo_fim,
        d.usuario_id,
        lower(u.email) as EMAIL,
        fn_capitalize(u.nome) as USUARIO
    
    from tbformulario f, tbformulario_destinatario d, tbusuario u
    where current_date between f.periodo_ini and f.periodo_fim
    and d.formulario_id = f.id
    and d.status_resposta = '0'
    and d.statusexclusao = '0'
    and u.codigo = d.usuario_id
    and d.visualiza_cadastro = 0

  into
    ID,
    TITULO,
    TEMPO,
    PERIODO_INI,
    PERIODO_FIM,
    USUARIO_ID,
    EMAIL,
    USUARIO
  do begin

    :CORPO = 'Pesquisa "'||fn_lpad(:ID, 6, '0')||'-'||:TITULO||'" ainda não foi respondida, tempo restante '||:TEMPO;

    execute procedure SPI_NOTIFICAR(current_timestamp, :USUARIO_ID, fn_elipses(:TITULO,50), :CORPO, 1, 1, 17);
    suspend;
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_PED_FAT_SDO_ANTEC (
    USUARIOS varchar(100))
as
declare variable ESTABELECIMENTO varchar(100);
declare variable CLIENTE varchar(200);
declare variable PEDIDO varchar(100);
declare variable DATA varchar(100);
declare variable VALOR_FATURADO varchar(200);
declare variable SALDO_ANTECIPACAO varchar(200);
declare variable USUARIO_ID integer;
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable ASSUNTO varchar(50);
declare variable REGISTROS integer;
begin

        ASSUNTO = 'Pedidos Faturados com Saldo Antecipado Pendente';
        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
       -- corpo1 = corpo1 || '<br>';
 
    for
      SELECT ESTABELECIMENTO,
             FORMATDATE(DATA),
             CLIENTE, 
             PEDIDO,
             FN_FORMAT_NUMBER(VALOR_FATURADO,2),
             FN_FORMAT_NUMBER(SALDO_ANTECIPACAO,2),
             COUNT(PEDIDO) OVER () AS REGISTROS
        FROM (
            SELECT  FN_LPAD(E.CODIGO,3,0) AS ESTABELECIMENTO,
                    A.DATA,
                    D.NOMEFANTASIA AS CLIENTE,
                    CAST(B.VALOR AS NUMERIC(15,2)) AS VALOR_ANTECIPACAO,
                    B.SALDO AS SALDO_ANTECIPACAO,
                    FN_LPAD(B.PEDIDO,6,'0') AS PEDIDO,
                   (SELECT SUM(
                           IIF(PI.SITUACAO = 2, PI.QUANTIDADE * PI.VALOR,
                           IIF(PI.SITUACAO = 1, PS.QUANTIDADE * PI.VALOR,
                           IIF(PI.SITUACAO = 3,(PI.QUANTIDADE - PS.QUANTIDADE) * PI.VALOR, 0))))
                      FROM TBPEDIDO_ITEM PI, TBPEDIDO_ITEM_SALDO PS
                     WHERE PI.PEDIDO = B.PEDIDO
                       AND PS.PEDIDO = B.PEDIDO
                       AND PI.CONTROLE = PS.PEDIDO_ITEM_CONTROLE
                       ) AS VALOR_FATURADO
               FROM TBCAIXABANCO_LANCAMENTO_CLASS A
              INNER JOIN TBCAIXABANCO_LANC_CLASS_SALDO  B ON A.CONTROLE = B.LANC_CLASS_ID
               LEFT JOIN TBCLASSIFICACAO_CONTABIL       C ON C.CODIGO = A.CLASSIFICACAO_CONTABIL
               LEFT JOIN TBEMPRESA                      D ON D.CODIGO = B.EMPRESA_ID
               LEFT JOIN TBESTABELECIMENTO              E ON E.CODIGO = A.ESTABELECIMENTO_CODIGO
              WHERE B.EMPRESA_ID > 0
                AND B.SALDO > 0
                AND B.PEDIDO > 0
                AND(A.TIPO = 'C' OR A.TIPO IS NULL)
              ORDER BY E.CODIGO, A.DATA
              )
            WHERE VALOR_FATURADO > 0
    into
        :ESTABELECIMENTO,
        :DATA,
        :CLIENTE,
        :PEDIDO,
        :VALOR_FATURADO,
        :SALDO_ANTECIPACAO,
        :REGISTROS
    do begin
        corpo1 = corpo1 || '<p style="font-weight: bold;"></p>';
        corpo1 = corpo1 || '<p><u>Dt.</u>'||:DATA
                        || ' - '  ||:CLIENTE
                        || '</p>';
        corpo1 = corpo1 || '<p><u>╚►PD.</u>'||:PEDIDO
                        || ' Vr.Fat. R$'||:VALOR_FATURADO
                        || ' Sld.Ant. R$'||:SALDO_ANTECIPACAO
                        || '</p>';
       End

       -- corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_28000/5832'||'" target="_blank">[ABRIR RELATÓRIO NO GCWEB]</a></p>';
        corpo1 = corpo1 || '</body></html>';

    if (:REGISTROS > 0) then
        BEGIN
            for
                SELECT U.CODIGO
                  FROM TBUSUARIO U
                  INNER JOIN (SELECT OSPLIT FROM SPLIT( :USUARIOS, ',' ) ) S ON S.OSPLIT = U.CODIGO
            into 
                :USUARIO_ID
            do begin

               execute procedure spi_notificar(
                  current_timestamp,
                  :USUARIO_ID,
                  :ASSUNTO,
                  :CORPO1,
                  1,
                  1,
                  5
               );
    
            end
       END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_PRIMEIRO_PEDIDO (
    USUARIOS varchar(100),
    CAVAL_VENDAS varchar(100),
    DIAS integer)
as
declare variable CLIENTE varchar(100);
declare variable PEDIDO varchar(6);
declare variable CANAL_VENDAS varchar(50);
declare variable XCANAL_VENDAS varchar(50);
declare variable DATA date;
declare variable USUARIO_ID integer;
declare variable EMAIL varchar(200);
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable ASSUNTO varchar(500);
declare variable REGISTROS integer;
begin

        ASSUNTO = 'Primeiro Pedido dos Clientes - '||FORMATDATE(CURRENT_DATE);
        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
       -- corpo1 = corpo1 || '<br>';
        XCANAL_VENDAS = '';

    --notificar se nota pendente de lan??amento
    for
        SELECT E.NOMEFANTASIA AS CLIENTE,
               FN_LPAD(P.PEDIDO,6,'0') AS PEDIDO,
               P.DATA,
               COUNT(P.PEDIDO) OVER () REGISTROS,
              (SELECT FIRST 1 C.DESCRICAO FROM TBCANAL_VENDAS C WHERE C.ID = P.CANAL_VENDAS_ID) AS CANAL_VENDAS
          FROM TBCLIENTE A,
               TBEMPRESA E,
               TBPEDIDO P
               INNER JOIN (SELECT OSPLIT OSPLIT FROM SPLIT( :CAVAL_VENDAS, ',' ) ) S ON S.OSPLIT = P.CANAL_VENDAS_ID
               -- INNER JOIN (SELECT REPLACE(OSPLIT,' ','_') OSPLIT FROM SPLIT( :PERFIL_PED, ',' ) ) S ON S.OSPLIT = REPLACE(P.CLASSIFICACAO,' ','_')
         WHERE A.CODIGO = P.CLIENTE_CODIGO
           AND E.CODIGO = A.CODIGO
           AND A.PRIMEIRO_PED_ID = P.PEDIDO  
           AND A.PRIMEIRO_PED_ORIGEM = 12201
           AND P.DATA >= CURRENT_DATE - :DIAS
        -- AND P.CLASSIFICACAO LIKE :PERFIL_PED
        ORDER BY 5, A.RAZAOSOCIAL, P.PEDIDO
    into
        :CLIENTE,
        :PEDIDO,
        :DATA,
        :REGISTROS,
        :CANAL_VENDAS
    do begin
        corpo1 = corpo1 || '<p style="font-weight: bold;"></p>';
        if (XCANAL_VENDAS <> :CANAL_VENDAS) then
            Begin
            corpo1 = corpo1 || '<p><b>'||:CANAL_VENDAS||'</b></p>';
            XCANAL_VENDAS = :CANAL_VENDAS;
            End
        corpo1 = corpo1 || '<p><u>Ped</u>: '||:PEDIDO||' - '||:CLIENTE||'</p>';
       End

       -- corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_28000/5829'||'" target="_blank">[ABRIR RELAT??RIO NO GCWEB]</a></p>';
        corpo1 = corpo1 || '</body></html>';

    if (:REGISTROS > 0) then
        BEGIN
            for
                SELECT U.CODIGO
                  FROM TBUSUARIO U
                  INNER JOIN (SELECT OSPLIT FROM SPLIT( :USUARIOS, ',' ) ) S ON S.OSPLIT = U.CODIGO
            into 
                :USUARIO_ID
            do begin
               execute procedure spi_notificar(
                  current_timestamp,
                  :USUARIO_ID,
                  :ASSUNTO,
                  :CORPO1,
                  1,
                  1,
                  5
               );
    
            end
       END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_ROMANEIO
as
declare variable ROMANEIO_ID integer;
declare variable NUMERO_NOTAFISCAL integer;
declare variable EMPRESA_ID integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_TAMANHO varchar(5);
declare variable STATUS char(1);
declare variable PERDA numeric(18,5);
declare variable QUANTIDADE_B_ROMANEIO numeric(18,5);
declare variable QUANTIDADE_L_ROMANEIO numeric(18,5);
declare variable NFE_ITEM_ID integer;
declare variable QUANTIDADE_NOTA numeric(18,5);
declare variable PRODUTO_DESCRICAO varchar(100);
declare variable RAZAOSOCIAL varchar(300);
declare variable NOMEFANTASIA varchar(300);
declare variable USUARIO_ID integer;
declare variable EMAIL varchar(200);
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable ASSUNTO varchar(500);
begin

    --notificar se nota pendente de lan??amento
    for
        select distinct
            ROMANEIO_ID,
            NUMERO_NOTAFISCAL,
            EMPRESA_ID,
            E.RAZAOSOCIAL,
            E.NOMEFANTASIA
        FROM VWROMANEIO_NOTA N, TBEMPRESA E
        WHERE N.STATUS > 1
        AND N.NFE_ITEM_ID = 0
        AND E.CODIGO = N.EMPRESA_ID
        AND N.RESOLVIDO = 0
    into
        ROMANEIO_ID,
        NUMERO_NOTAFISCAL,
        EMPRESA_ID,
        RAZAOSOCIAL,
        NOMEFANTASIA
    do begin
        
        ASSUNTO = 'Romaneio (Pendencia de Lancamento da Nota Fiscal)';

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_15210?ID='||:ROMANEIO_ID||'" target="_blank">[ABRIR NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||:ROMANEIO_ID||'</u></p>';
        corpo1 = corpo1 || '<p><u>NF</u>: '||:NUMERO_NOTAFISCAL||'</p>';
        corpo1 = corpo1 || '<p><u>Empresa</u>: '||:EMPRESA_ID||' - '||:RAZAOSOCIAL||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        for
            select
                u.email,
                u.codigo
            from tbcontrole_usuario o,  tbusuario u
            where u.codigo = o.usuario_id
            and o.id = 899
            and o.valor_ext = '1'
        into
            :EMAIL,
            :USUARIO_ID
        do begin
           execute procedure spi_notificar(
              current_timestamp,
              :USUARIO_ID,
              :assunto,
              :corpo1,
              1,
              1,
              9
           );

        end

    end

    --notificar se nota pendente de lancamento
    for
        select distinct
            ROMANEIO_ID,
            NUMERO_NOTAFISCAL,
            EMPRESA_ID,
            E.RAZAOSOCIAL,
            E.NOMEFANTASIA
        from vwromaneio_nota n, tbempresa e
        where n.status < 1
        and n.romaneio_id > 0
        and n.nfe_item_id > 0
        and e.codigo = n.empresa_id

    into
        ROMANEIO_ID,
        NUMERO_NOTAFISCAL,
        EMPRESA_ID,
        RAZAOSOCIAL,
        NOMEFANTASIA
    do begin
        
        ASSUNTO = 'Romaneio (Pendente de Conferencia)';

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_15210?ID='||:ROMANEIO_ID||'" target="_blank">[ABRIR NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||:ROMANEIO_ID||'</u></p>';
        corpo1 = corpo1 || '<p><u>NF</u>: '||:NUMERO_NOTAFISCAL||'</p>';
        corpo1 = corpo1 || '<p><u>Empresa</u>: '||:EMPRESA_ID||' - '||:RAZAOSOCIAL||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        for
            select
                u.email,
                u.codigo
            from tbcontrole_usuario o,  tbusuario u
            where u.codigo = o.usuario_id
            and o.id = 900
            and o.valor_ext = '1'
        into
            :EMAIL,
            :USUARIO_ID
        do begin
           execute procedure spi_notificar(
              current_timestamp,
              :USUARIO_ID,
              :assunto,
              :corpo1,
              1,
              1
           );

        end

    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_ROMANEIO_PEND (
    ROMANEIO integer)
as
declare variable ROMANEIO_ID integer;
declare variable NUMERO_NOTAFISCAL integer;
declare variable EMPRESA_ID integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_TAMANHO varchar(5);
declare variable STATUS char(1);
declare variable PERDA numeric(18,5);
declare variable QUANTIDADE_B_ROMANEIO numeric(18,5);
declare variable QUANTIDADE_L_ROMANEIO numeric(18,5);
declare variable QUANTIDADE_NOTA numeric(18,5);
declare variable PRODUTO_DESCRICAO varchar(100);
declare variable RAZAOSOCIAL varchar(300);
declare variable NOMEFANTASIA varchar(300);
declare variable USUARIO_ID integer;
declare variable EMAIL varchar(200);
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable CORPO2 blob sub_type 1 segment size 80;
declare variable TABELA blob sub_type 1 segment size 80;
declare variable ASSUNTO varchar(500);
BEGIN

    ASSUNTO = 'ROMANEIO (DIVERG??NCIA ROMANEIO/NOTA FISCAL)';

    TABELA =  '<TABLE BORDERCOLOR="BLACK" BORDERCOLORLIGHT="#33CCFF" BORDER="5" STYLE="BORDER: 1PX SOLID; BORDER-SPACING: 1PX; BORDER-COLLAPSE: COLLAPSE;" CLASS="TBL"><THEAD STYLE="BACKGROUND-COLOR: #337AB7;COLOR: WHITE;"><TR>'||
                '<TH STYLE="PADDING: 3PX;" CLASS="COL-0">ID</TH>'||
                '<TH STYLE="PADDING: 3PX;" CLASS="COL-1">PRODUTO</TH>'||
                '<TH STYLE="PADDING: 3PX;" CLASS="COL-2">PERDA</TH>'||
                '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">QTD. BRUTA</TH>'||
                '<TH STYLE="PADDING: 3PX;" CLASS="COL-4">QTD. LIQUIDA</TH>'||
                '<TH STYLE="PADDING: 3PX;" CLASS="COL-5">QTD. NOTA</TH>'||
              '</TR></THEAD><TBODY>';

    --NOTIFICAR
    FOR
        SELECT DISTINCT
            N.ROMANEIO_ID,
            N.NUMERO_NOTAFISCAL,
            N.EMPRESA_ID,
            N.PRODUTO_ID,
            N.PRODUTO_TAMANHO,
            N.STATUS,
            N.PERDA,
            N.QUANTIDADE_B_ROMANEIO,
            N.QUANTIDADE_L_ROMANEIO,
           -- N.NFE_ITEM_ID,
            N.QUANTIDADE_NOTA,
            N.PRODUTO_DESCRICAO,
            E.RAZAOSOCIAL,
            E.NOMEFANTASIA
        FROM VWROMANEIO_NOTA N, TBEMPRESA E
        WHERE N.STATUS > 1
        AND N.QUANTIDADE_B_ROMANEIO <> N.QUANTIDADE_NOTA
        AND N.ROMANEIO_ID = :ROMANEIO
        AND E.CODIGO = N.EMPRESA_ID
    INTO
        ROMANEIO_ID,
        NUMERO_NOTAFISCAL,
        EMPRESA_ID,
        PRODUTO_ID,
        PRODUTO_TAMANHO,
        STATUS,
        PERDA,
        QUANTIDADE_B_ROMANEIO,
        QUANTIDADE_L_ROMANEIO,
       -- NFE_ITEM_ID,
        QUANTIDADE_NOTA,
        PRODUTO_DESCRICAO,
        RAZAOSOCIAL,
        NOMEFANTASIA
    DO BEGIN

        TABELA = TABELA||'<TR CLASS="--">';
        TABELA = TABELA||'<TD STYLE="PADDING: 3PX;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(PRODUTO_ID            ,'')||'</TD>';
        TABELA = TABELA||'<TD STYLE="PADDING: 3PX; OVERFLOW: HIDDEN; TEXT-OVERFLOW: ELLIPSIS; WHITE-SPACE: NOWRAP;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(PRODUTO_DESCRICAO     ,'')||'</TD>';
        TABELA = TABELA||'<TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(PERDA                 ,'')||'</TD>';
        TABELA = TABELA||'<TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(QUANTIDADE_B_ROMANEIO ,'')||'</TD>';
        TABELA = TABELA||'<TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(QUANTIDADE_L_ROMANEIO ,'')||'</TD>';
        TABELA = TABELA||'<TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(QUANTIDADE_NOTA       ,'')||'</TD>';
        TABELA = TABELA||'</TR>';

    END

    CORPO1 = '<HTML><HEAD><META CHARSET="CONTENT-TYPE: TEXT/HTML; CHARSET=UTF-8"><STYLE>P {MARGIN: 2PX;}</STYLE></HEAD><BODY>';
    CORPO1 = CORPO1 || '<P></P>';
    CORPO1 = CORPO1 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_15210?ID='||:ROMANEIO_ID,'')||'" TARGET="_BLANK">[ABRIR NA WEB]</A></P>';
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || '<P STYLE="FONT-WEIGHT: BOLD;"><U>ID: '||COALESCE(:ROMANEIO_ID,'')||'</U></P>';
    CORPO1 = CORPO1 || '<P><U>NF</U>: '||COALESCE(:NUMERO_NOTAFISCAL,'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>EMPRESA</U>: '||COALESCE(:EMPRESA_ID,'')||' - '||COALESCE(:RAZAOSOCIAL,'')||'</P>';
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || TABELA;
    CORPO1 = CORPO1 || '</TBODY></TABLE></BODY></HTML>';

    CORPO2 = '<HTML><HEAD><META CHARSET="CONTENT-TYPE: TEXT/HTML; CHARSET=UTF-8"><STYLE>P {MARGIN: 2PX;}</STYLE></HEAD><BODY>';
    CORPO2 = CORPO2 || '<P></P>';
    CORPO2 = CORPO2 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_15210?ID='||:ROMANEIO_ID,'')||'" TARGET="_BLANK">[ABRIR NA WEB]</A></P>';
    CORPO2 = CORPO2 || '<BR>';
    CORPO2 = CORPO2 || '<P STYLE="FONT-WEIGHT: BOLD;"><U>ID: '||COALESCE(:ROMANEIO_ID,'')||'</U></P>';
    CORPO2 = CORPO2 || '<P><U>NF</U>: '||COALESCE(:NUMERO_NOTAFISCAL,'')||'</P>';
    CORPO2 = CORPO2 || '<P><U>EMPRESA</U>: '||COALESCE(:EMPRESA_ID||' - '||:RAZAOSOCIAL,'')||'</P>';
    CORPO2 = CORPO2 || '<BR>';
    CORPO2 = CORPO2 || '<P>DIVERG??NCIA ENTRE QUANTIDADES NO ROMANEIO E NOTA FISCAL. PARA DETALHAMENTO, VERIFIQUE SEU E-MAIL OU CLIQUE NO LINK ACIMA.</P>';
    CORPO2 = CORPO2 || '</TBODY></TABLE></BODY></HTML>';

    IF( COALESCE(:ROMANEIO_ID,0) > 0 )THEN
    BEGIN
        FOR
            SELECT
                U.EMAIL,
                U.CODIGO
            FROM TBCONTROLE_USUARIO O,  TBUSUARIO U
            WHERE U.CODIGO = O.USUARIO_ID
            AND O.ID = 901
            AND O.VALOR_EXT = '1'
            and coalesce(u.email,'') <> ''
        INTO
            :EMAIL,
            :USUARIO_ID
        DO BEGIN
    
           EXECUTE PROCEDURE SPI_NOTIFICAR(
              CURRENT_TIMESTAMP,
              :USUARIO_ID,
              :ASSUNTO,
              :CORPO1,
              1,
              0
           );
    
           EXECUTE PROCEDURE SPI_NOTIFICAR(
              CURRENT_TIMESTAMP,
              :USUARIO_ID,
              :ASSUNTO,
              :CORPO2,
              0,
              1,
              9
           );
        
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICAR_V2 (
    HORA timestamp,
    USUARIO_ID varchar(500),
    ASSUNTO varchar(500),
    CORPO blob sub_type 1 segment size 80,
    EMAIL integer = 1,
    NOTIFICACAO integer = 1,
    MODULO_EMAIL INTEGER = 0)
as
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(100);
BEGIN

    DESTINATARIO = (SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID);

    IF ( NOTIFICACAO = 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,
            :USUARIO_ID,
            0,
            0,
            fn_elipses(COALESCE(:ASSUNTO,'NOVO EMAIL'),50),
            0,
            0,
            :HORA,
            :USUARIO_ID,
            :HORA,
            0,
            '',
            0,
            COALESCE(:CORPO,'')
        );

    END

    IF ( EMAIL = 1 ) THEN
    BEGIN

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

        if(coalesce(DESTINATARIO,'') <> '' and DESTINATARIO is distinct from null)then
        begin
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                COALESCE(:ASSUNTO,'NOVO EMAIL'),
                COALESCE(:CORPO,''),
                0,
                :HORA,
                :MODULO_EMAIL
            );
       end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICAR_V2 (
    HORA timestamp,
    USUARIO_ID varchar(500),
    ASSUNTO varchar(500),
    CORPO blob sub_type 1 segment size 80,
    EMAIL integer = 1,
    NOTIFICACAO integer = 1,
    MODULO_EMAIL INTEGER = 0)
as
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(100);
BEGIN

    DESTINATARIO = (SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID);

    IF ( NOTIFICACAO = 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,
            :USUARIO_ID,
            0,
            0,
            fn_elipses(COALESCE(:ASSUNTO,'NOVO EMAIL'),50),
            0,
            0,
            :HORA,
            :USUARIO_ID,
            :HORA,
            0,
            '',
            0,
            COALESCE(:CORPO,'')
        );

    END

    IF ( EMAIL = 1 ) THEN
    BEGIN

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

        if(coalesce(DESTINATARIO,'') <> '' and DESTINATARIO is distinct from null)then
        begin
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                COALESCE(:ASSUNTO,'NOVO EMAIL'),
                COALESCE(:CORPO,''),
                0,
                :HORA,
                :MODULO_EMAIL
            );
       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 =
            '
            <tr>              
                <td> ' || vLOCALIZACAO_ID||' - '||vLOCALIZACAO_DESCRICAO || '</td>
                <td> ' || vPRODUTO_ID|| ' - '||vPRODUTO_DESCRICAO          || '</td>
                <td> ' || CAST(:QUANTIDADE AS NUMERIC(15,2)) || '</td>
            </tr> ';

        HTML_CORPO =
       '<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 =
            '
            <tr>              
                <td> ' || vLOCALIZACAO_ID||' - '||vLOCALIZACAO_DESCRICAO || '</td>
                <td> ' || vPRODUTO_ID|| ' - '||vPRODUTO_DESCRICAO          || '</td>
            </tr> ';

        HTML_CORPO =
       '<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 SPU_CLIENTE_BLOQUEIOS
returns (
    TIPO varchar(100),
    REPRESENTANTE_NOMEFANTASIA varchar(100),
    CLIENTE_ID integer,
    RAZAOSOCIAL varchar(50),
    MOTIVO varchar(50))
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 OUTRASPARCELAS integer;
declare variable NFS integer;
declare variable NFE integer;
declare variable PED integer;
declare variable MOVFIN integer;
declare variable MOVPED integer;
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 MOTIVO_INATIVACAO varchar(1000);
BEGIN

  REPRES_EMAIL_ID = 0;
  CORPO_EMAIL1 = '';
  CORPO_EMAIL2 = '';
  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 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 = '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(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 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);

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

              MOVPED  =  COALESCE((
                                  SELECT CURRENT_DATE - MAX(DATA) FROM (
                                  SELECT MAX(P.DATA) DATA FROM TBPEDIDO P -- , TBPERFIL PF
                                   WHERE P.CLIENTE_CODIGO = :CLIENTE_ID
                                    -- AND PF.ID = P.CLASSIFICACAO
                                    -- AND PF.TABELA = 'PED'
                                    -- AND PF.VENDA = 1
                                   UNION ALL
                                  SELECT MAX(PR.DATA) DATA FROM TBPDV_CONFERENCIA PR
                                   WHERE PR.CLIENTE_ID = :CLIENTE_ID)),99999);

              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 < :MOVFIN and :MOV_DATABASE > :INATIVA_DIAS_SEMMOV) or (:MOV_DATABASE >= :MOVFIN and :MOVFIN > :INATIVA_DIAS_SEMMOV)   OR
                       (: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
                            
                          -- GRAVA HISTORICO NO CAD DE CLIENTE
                             if (:MOV_DATABASE  < :MOVPED) then
                                  Begin
                                   MOTIVO_INATIVACAO = 'CLIENTE INATIVADO AUTOMATICAMENTE POR NAO TER PEDIDOS/PRE-PEDIDOS APOS DATA BASE DO CADASTRO!';
                                   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),
                                   'CLIENTE INATIVADO AUTOMATICAMENTE POR NAO TER PEDIDOS/PRE-PEDIDOS APOS DATA BASE DO CADASTRO!');
                                   MOTIVO = 'SEM PEDIDOS/PRE-PEDIDOS';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVPED) Then
                                  BEGIN
                                   MOTIVO_INATIVACAO = 'CLIENTE INATIVADO AUTOMATICAMENTE POR ESTAR SEM PEDIDOS/PRE-PEDIDOS';
                                   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),
                                   'CLIENTE INATIVADO AUTOMATICAMENTE POR ESTAR SEM PEDIDOS/PRE-PEDIDOS');
                                   MOTIVO = 'SEM PEDIDOS/PRE-PEDIDOS';
                                  END ELSE

                             if (:MOV_DATABASE  < :MOVFIN) then
                                  Begin
                                   MOTIVO_INATIVACAO = 'CLIENTE INATIVADO AUTOMATICAMENTE POR NAO TER MOVIMENTACAO FINANCEIRA APOS DATA BASE DO CADASTRO!';
                                   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),
                                   'CLIENTE INATIVADO AUTOMATICAMENTE POR NAO TER MOVIMENTACAO FINANCEIRA APOS DATA BASE DO CADASTRO!');
                                   MOTIVO = 'SEM MOVIMENTACAO FINANCEIRA';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVFIN) Then
                                  BEGIN
                                   MOTIVO_INATIVACAO = 'CLIENTE INATIVADO AUTOMATICAMENTE POR ESTAR SEM MOVIMENTACAO FINANCEIRA';
                                   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),
                                   'CLIENTE INATIVADO AUTOMATICAMENTE POR ESTAR SEM MOVIMENTACAO FINANCEIRA');
                                   MOTIVO = 'SEM MOVIMENTACAO FINANCEIRA';
                                  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 = 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 





        
              --Bloqueios do cliente por nao haver movimentacoes financeiras
              if (:BLOQUEIO_DIAS_SEMMOV > 0) then
                  Begin
                  if ( (:MOV_DATABASE < :MOVFIN and :MOV_DATABASE > :BLOQUEIO_DIAS_SEMMOV) or (:MOV_DATABASE >= :MOVFIN and :MOVFIN > :BLOQUEIO_DIAS_SEMMOV)   OR
                       (: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
                           --Grava Historico no cad de cliente
                             if (:MOV_DATABASE  < :MOVPED) then
                                  Begin
                                   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),
                                   'CLIENTE BLOQUEADO AUTOMATICAMENTE POR NAO TER PEDIDO/PRE-PEDIDO APOS DATA BASE DO CADASTRO!');
                                   MOTIVO = 'SEM PEDIDO/PRE-PEDIDO';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVPED) Then
                                  BEGIN
                                   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),
                                   'CLIENTE BLOQUEADO AUTOMATICAMENTE POR ESTAR SEM PEDIDO/PRE-PEDIDO');
                                   MOTIVO = 'SEM PEDIDO/PRE-PEDIDO';
                                  END ELSE

                             if (:MOV_DATABASE  < :MOVFIN) then
                                  Begin
                                   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),
                                   'CLIENTE BLOQUEADO AUTOMATICAMENTE POR NAO TER MOVIMENTACAO FINANCEIRA APOS DATA BASE DO CADASTRO!');
                                   MOTIVO = 'SEM MOVIMENTACAO FINANCEIRA';
                                  End ELSE

                             if (:MOV_DATABASE >= :MOVFIN) Then
                                  BEGIN
                                   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),
                                   'CLIENTE BLOQUEADO AUTOMATICAMENTE POR ESTAR SEM MOVIMENTACAO FINANCEIRA');
                                   MOTIVO = 'SEM MOVIMENTACAO FINANCEIRA';
                                  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 = 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 
        










              --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
                           --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),
                             'CLIENTE BLOQUEADO PARA PEDIDOS AUTOMATICAMENTE POR ATRASO HA '||COALESCE(:DIASATRASO,0)||' DIAS.');
        
                             --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||' (PEDIDO BLOQUEADO POR INADIMPLENCIA - '||:DIASATRASO||' DIAS DE ATRASO)';
                                CORPO_EMAIL2 = CORPO_EMAIL2||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' (PEDIDO BLOQUEADO POR INADIMPLENCIA - '||:DIASATRASO||' DIAS DE ATRASO)';
                                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
                           --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),
                             'CLIENTE BLOQUEADO PARA NF AUTOMATICAMENTE POR ATRASO HA '||COALESCE(:DIASATRASO,0)||' DIAS.');
        
                             --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||' (CLIENTE BLOQUEADO POR INADIMPLENCIA - '||:DIASATRASO||' DIAS DE ATRASO)';
                                CORPO_EMAIL2 = CORPO_EMAIL2||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' (CLIENTE BLOQUEADO POR INADIMPLENCIA - '||:DIASATRASO||' DIAS DE ATRASO)';
                                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
                           --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),
                             'CLIENTE BLOQUEADO AUTOMATICAMENTE POR MOTIVO DE CHEQUE DEVOLVIDO.');
        
                             --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||' (CLIENTE BLOQUEADO POR CHEQUE DEVOLVIDO)';
                                CORPO_EMAIL2 = CORPO_EMAIL2||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||FN_LPAD(:CLIENTE_ID,5,'0') ||' - ' ||:RAZAOSOCIAL||' (CLIENTE BLOQUEADO POR CHEQUE DEVOLVIDO)';
                                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_DESBLOQUEIOS
returns (
    TIPO varchar(100),
    REPRESENTANTE_NOMEFANTASIA varchar(100),
    CLIENTE_ID integer,
    RAZAOSOCIAL varchar(50),
    MOTIVO varchar(100))
as
declare variable REPRESENTANTE_ID integer;
declare variable REPRESENTANTE_EMAIL varchar(200);
declare variable DIASATRASO 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 BLOQUEIO_DIAS_SEMMOV integer;
declare variable MOVPED integer;
declare variable CHQ integer;
BEGIN

  REPRES_EMAIL_ID = 0;
  CORPO_EMAIL1 = '';
  CORPO_EMAIL2 = '';
  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 DESBLOQUEIO DE CLIENTES EXECUTADO!');

        FOR
        SELECT DISTINCT
               C.CODIGO AS 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_SEMMOV
          FROM TBCLIENTE C, TBEMPRESA E
         WHERE  C.CODIGO = E.CODIGO
           AND  C.REPRESENTANTE_CODIGO > 0
           AND  C.STATUS = '1'  
           AND  C.BLOQUEIO_DIAS_ATRASO > 0
           AND  C.BLOQUEIO_MOTIVO = 'ATRASO'
           AND( COALESCE(C.BLOQUEIA_PEDIDO    ,'0') = '1' OR
                COALESCE(C.BLOQUEIA_NOTAFISCAL,'0') = '1' )
        
        ORDER BY 5, 2
        
        INTO :CLIENTE_ID, :RAZAOSOCIAL, :REPRESENTANTE_ID, 
             :REPRESENTANTE_NOMEFANTASIA, :REPRESENTANTE_EMAIL,
             :BLOQUEIO_DIAS_SEMMOV
        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 = 'CLIENTES DESBLOQUEADOS AUTOMATICAMENTE POR NAO HAVER PENDENCIAS FINANCEIRAS:'||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 - DESBLOQUEIO DE CLIENTES', :CORPO_EMAIL1, 0, Current_TimeStamp, 5);
                End
            CORPO_EMAIL1 = '';
            Envia_Email1 = '0';
            End

              DIASATRASO = 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 F.UTILIZA_LIMITE_CREDITO = 1
                                        ),0);

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

              MOVPED  =  COALESCE((
                                  SELECT CURRENT_DATE - MAX(DATA) FROM (
                                  SELECT MAX(P.DATA) DATA FROM TBPEDIDO P, TBPERFIL PF
                                   WHERE PF.ID = P.CLASSIFICACAO AND PF.TABELA = 'PED' AND PF.VENDA = 1 AND P.CLIENTE_CODIGO = :CLIENTE_ID
                                   UNION ALL
                                  SELECT MAX(PR.DATA) DATA FROM TBPDV_CONFERENCIA PR
                                   WHERE PR.CLIENTE_ID = :CLIENTE_ID)),99999);
        
              --Desbloqueios do cliente por sem pendencias financeiras e com pedidos dentro do período e sem cheques devolvidos
                  if ( (:DIASATRASO = 0) and ((BLOQUEIO_DIAS_SEMMOV > 0) and (MOVPED < BLOQUEIO_DIAS_SEMMOV)) AND (CHQ = 0) ) Then
                      Begin
                       --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),
                         'CLIENTE DESBLOQUEADO AUTOMATICAMENTE POR NAO HAVER PENDENCIAS FINANCEIRAS, CHEQUES DEVOLVIDOS E COM PEDIDOS NO PRAZO');

                       --Bloqueia Cliente (Pedido e Nota Fiscal)
                         UPDATE TbCliente Set
                         BLOQUEIA_NOTAFISCAL = '0',
                         BLOQUEIA_PEDIDO = '0',
                         BLOQUEIO_MOTIVO = ''
                         Where Codigo = :Cliente_Id;

                         TIPO = 'DESBLOQUEADO';
                         MOTIVO = 'SEM PENDENCIA FINANCEIRA/COM PEDIDOS';
                         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_ID ||' - ' ||:REPRESENTANTE_NOMEFANTASIA;
                            End

                        CORPO_EMAIL1 = CORPO_EMAIL1||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||:CLIENTE_ID ||' - ' ||:RAZAOSOCIAL;
                        CORPO_EMAIL2 = CORPO_EMAIL2||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||:CLIENTE_ID ||' - ' ||:RAZAOSOCIAL;
                        REPRES_EMAIL_ID = :REPRESENTANTE_ID;
                        Envia_Email1 = '1';
                        Envia_Email2 = '1';

                        REPRES_EMAIL = :REPRESENTANTE_EMAIL;
                      End
        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>'||'CLIENTES DESBLOQUEADOS 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 - DESBLOQUEIO DE CLIENTES', :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>'||'CLIENTES DESBLOQUEADOS 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 - DESBLOQUEIO DE CLIENTES', :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 =  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

                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 = '<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>';

                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_PENDENCIA2 (
    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)
as
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.razaosocial
                --,e.email_cpa
                ,'suporte@delfa.com.br'
                ,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,: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 = 1)then
                begin
                    VERIFICAR = 1;
                end

            r_id = ID;
            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 = VERIFICAR;
            r_email = email;
            EMAIL_OLD = email;

    
                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

                SUSPEND;

            end
            else
            begin

            r_id = ID;
            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 )) then
                begin
                    if(VERIFICAR = 1)then
                    begin

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

                        CONTENVIOS = CONTENVIOS + 1;
                         
                    end
                end
                else
                begin
                    VERIFICAR = 0;
                    contnaoenvios = contnaoenvios + 1;
                end
            
                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>';

                SUSPEND;

            end
    
            IDANTERIOR = ID;
    
        END
     end else
     begin
        FOR
    
            Select
                a.empresa_codigo
                ,e.razaosocial
                --,e.email_cpa
                ,'suporte@delfa.com.br'
                ,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,: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_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; 
                    end
                end
            
                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_NFS_ENVIO_DIFAL (
    NFS_ID integer)
as
declare variable IPICMSINTERPART numeric(15,2);
declare variable IND_FINAL char(1);
declare variable ORIGEM_UF varchar(2);
declare variable DESTINO_UF varchar(2);
declare variable EMPRESA_IE varchar(20);
declare variable REGIME_TRIBUTARIO char(1);
declare variable TIPO char(1);
declare variable DATA_EMISSAO date;
declare variable NFS_ITEM_ID integer;
declare variable PRODUTO_ID integer;
declare variable NCM_CODIGO varchar(10);
declare variable VALOR_BASECALCULO_ICMS numeric(15,2);
declare variable PERCENTUAL_ICMS numeric(15,2);
declare variable ALIQUOTA_ICMS_DESTINO numeric(15,2);
declare variable ALIQUOTA_ICMS_ORIGEM numeric(15,2);
declare variable ALIQUOTA_FCP numeric(15,2);
declare variable ALIQUOTA_INTERESTADUAL numeric(15,2);
declare variable IVBCUFDEST numeric(15,2);
declare variable IPFCPUFDEST numeric(15,2);
declare variable IPICMSUFDEST numeric(15,2);
declare variable IPICMSINTER numeric(15,2);
declare variable IVFCPUFDEST numeric(15,2);
declare variable IVICMSUFDEST numeric(15,2);
declare variable IVICMSUFREMET numeric(15,2);
declare variable FLAG_DIFAL integer;
declare variable DISPARAR_EMAIL integer;
declare variable ASSUNTO_EMAIL varchar(500);
declare variable TITULO_EMAIL varchar(500);
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable ESTAB_NOMEFANTASIA varchar(200);
declare variable CLIENTE_RAZAOSOCIAL varchar(300);
declare variable DOCUMENTO_SERIE varchar(100);
declare variable VALOR_TOTAL numeric(15,2);
declare variable CLIENTE_CNPJ varchar(100);
declare variable VALOR_TOTAL_DIFAL numeric(15,2);
declare variable EMAIL varchar(200);
declare variable USUARIO_ID integer;
BEGIN

  :DISPARAR_EMAIL = 1;

  FOR
  SELECT
        N.IND_FINAL,
        E.UF ORIGEM_UF,
        N.EMPRESA_UF DESTINO_UF,
        N.EMPRESA_IE,
        E.REGIME_TRIBUTARIO,
        N.DATA_EMISSAO,
        E.NOMEFANTASIA AS ESTAB_NOMEFANTASIA,
        COALESCE((SELECT FIRST 1 C.RAZAOSOCIAL||'('||C.UF||')' FROM TBEMPRESA C WHERE C.CODIGO = N.EMPRESA_CODIGO),'') AS CLIENTE_RAZAOSOCIAL,
        COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(C.CNPJ) > 11,' CNPJ:'||FN_MASK(C.CNPJ,'CNPJ'),' CPF:'||FN_MASK(C.CNPJ,'CPF')) FROM TBEMPRESA C WHERE C.CODIGO = N.EMPRESA_CODIGO),'') AS CLIENTE_CNPJ,
        FN_LPAD(N.NUMERO_NOTAFISCAL,9,0)||'/'||FN_LPAD(N.SERIE,3,0) AS DOCUMENTO_SERIE,
        CAST(COALESCE((SELECT FIRST 1 T.VALOR_TOTAL_NF FROM TBNFS_TOTAIS T WHERE T.NFS_CONTROLE = N.CONTROLE), 0) AS NUMERIC(15,2)) AS VALOR_TOTAL,
        N.TIPO
  FROM TBNFS N, TBESTABELECIMENTO E
  WHERE N.ESTABELECIMENTO_CODIGO = E.CODIGO
    AND CONTROLE = :NFS_ID
  INTO :IND_FINAL, :ORIGEM_UF, :DESTINO_UF, :EMPRESA_IE, :REGIME_TRIBUTARIO, :DATA_EMISSAO, :ESTAB_NOMEFANTASIA, :CLIENTE_RAZAOSOCIAL, :CLIENTE_CNPJ, :DOCUMENTO_SERIE, :VALOR_TOTAL, :TIPO
    DO
      BEGIN

        IF(:TIPO <> '2' AND :TIPO <> '3' AND :REGIME_TRIBUTARIO <> '1') THEN
        BEGIN
            IF ( (ORIGEM_UF <> DESTINO_UF AND DESTINO_UF <> 'EX') AND (TRIM(EMPRESA_IE) = '') ) THEN
                BEGIN
    
                  -- PERCENTUAL REFERENTE AO ANO DE 2016 (40%)
                  IF (EXTRACT (YEAR FROM DATA_EMISSAO) = 2015) THEN BEGIN IPICMSINTERPART = 20.00; END ELSE
                  IF (EXTRACT (YEAR FROM DATA_EMISSAO) = 2016) THEN BEGIN IPICMSINTERPART = 40.00; END ELSE
                  IF (EXTRACT (YEAR FROM DATA_EMISSAO) = 2017) THEN BEGIN IPICMSINTERPART = 60.00; END ELSE
                  IF (EXTRACT (YEAR FROM DATA_EMISSAO) = 2018) THEN BEGIN IPICMSINTERPART = 80.00; END ELSE
                  IF (DATA_EMISSAO >= '01.01.2019') THEN BEGIN IPICMSINTERPART = 100.00; END
    
                  FOR
                    SELECT
                        T.CONTROLE,
                        T.PRODUTO_CODIGO,
                        IIF(T.VALOR_BASECALCULO_ICMS > 0, T.VALOR_BASECALCULO_ICMS, T.VALOR_CONTABIL),
                        T.PERCENTUAL_ICMS,
                        T.NCM_CODIGO
                    FROM TBNFS_ITEM T
                    INNER JOIN TBCFOP C ON C.CODIGO = T.CFOP_CODIGO
                    INNER JOIN TBTRIBUTACAO_ICMS ICMS ON ICMS.CODIGO = T.TRIBUTACAO_ICMS
                    WHERE NFS_CONTROLE = :NFS_ID
                    AND ICMS.GERA_DIFAL = 1
                    AND C.GERA_DIFAL = 1
                    INTO :NFS_ITEM_ID, :PRODUTO_ID, :VALOR_BASECALCULO_ICMS, :PERCENTUAL_ICMS, :NCM_CODIGO
                      DO
                        BEGIN
    
                        IF (VALOR_BASECALCULO_ICMS > 0) THEN
                            BEGIN
                    
                               FOR
                                SELECT FIRST 1 COALESCE(U.ALIQUOTA_ICMS,0.00) ALIQUOTA_ICMS_DESTINO,
                                  COALESCE((SELECT FIRST 1 UO.ALIQUOTA_ICMS FROM TBUF UO WHERE UO.UF = :ORIGEM_UF),0.00) ALIQUOTA_ICMS_ORIGEM,
                                  COALESCE((SELECT FIRST 1 FF.ALIQUOTA_FCP FROM TBFAMILIA_FCP FF, TBPRODUTO P
                                             WHERE P.FAMILIA_CODIGO = FF.FAMILIA_ID AND FF.UF = U.UF AND FF.NCM_CODIGO = :NCM_CODIGO AND P.CODIGO = :PRODUTO_ID),0.00) ALIQUOTA_FCP,
                                  COALESCE((SELECT FIRST 1 TII.ALIQUOTA_ICMS FROM TBTRIBUTACAO_ICMS_INTERESTADUAL TII
                                             WHERE TII.UF_ORIGEM = :ORIGEM_UF AND TII.UF_DESTINO = :DESTINO_UF),0.00) ALIQUOTA_INTERESTADUAL
    
                                FROM TBUF U
                                WHERE U.UF = :DESTINO_UF
                                INTO  :ALIQUOTA_ICMS_DESTINO, :ALIQUOTA_ICMS_ORIGEM, :ALIQUOTA_FCP, :ALIQUOTA_INTERESTADUAL
                                    DO
                                      BEGIN

                                          :FLAG_DIFAL = CAST(FN_PARAMETRO('SISTEMA.FLAG_DIFAL') AS INTEGER);
                                          IF(:FLAG_DIFAL = 1) THEN
                                          BEGIN
                                             :DISPARAR_EMAIL = 0;
                                          END
    
                                      END
    
                            END
    
                        END
    
                        -- DIFAL DA UF DE ORIGEM - VICMSUFDEST
                        -- FCP - VFCPUFDEST
                        -- DIFAL DA UF DESTINO - VICMSUFREMET
                        
                        /*SE HOUVER MOTIVO DEVE SER ADICIONADO NO EMAIL APOS A TABELA E SEU RESUMO*/
                        IF(:DISPARAR_EMAIL = 0)THEN
                        BEGIN
                            :VALOR_TOTAL_DIFAL = CAST(COALESCE((SELECT SUM(COALESCE(A.VICMSUFDEST,0)+COALESCE(A.VFCPUFDEST,0)+COALESCE(A.VICMSUFREMET,0)) FROM TBNFS_ITEM A WHERE A.NFS_CONTROLE = :NFS_ID),0) AS NUMERIC(15,2));
                            :DISPARAR_EMAIL    = 1;
                            :ASSUNTO_EMAIL     = 'DOCUMENTO FISCAL '||:DOCUMENTO_SERIE||' COM DIFAL EMITIDA';
                            :TITULO_EMAIL      = 'DOCUMENTO FISCAL '||:DOCUMENTO_SERIE||' COM DIFAL EMITIDA';
    
                            CORPO1 = '<HTML><HEAD><META CHARSET="CONTENT-TYPE: TEXT/HTML; CHARSET=UTF-8"><STYLE>P {MARGIN: 2PX;}</STYLE></HEAD><BODY>';
                            CORPO1 = CORPO1 || '<P></P>';
                            CORPO1 = CORPO1 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_21150?NF_ID='||:NFS_ID,'')||'" TARGET="_BLANK">[ABRIR NA WEB]</A></P>';
                            CORPO1 = CORPO1 || '<BR>';
                            CORPO1 = CORPO1 || '<P><U>DOCUMENTO FISCAL: '||:DOCUMENTO_SERIE||'</U></P>';
                            CORPO1 = CORPO1 || '<P><U>DATA DE EMISSAO</U>: '||FN_DATE(:DATA_EMISSAO, 'DD/MM/YYYY')||'</P>';
                            CORPO1 = CORPO1 || '<P><U>ESTABELECIMENTO</U>: '||COALESCE(:ESTAB_NOMEFANTASIA,'')||'</P>';
                            CORPO1 = CORPO1 || '<P><U>DESTINATARIO</U>: '||COALESCE(:CLIENTE_RAZAOSOCIAL,'')||'</P>';
                            CORPO1 = CORPO1 || '<P><U>'||COALESCE(:CLIENTE_CNPJ,'')||'</U></P>';
                            CORPO1 = CORPO1 || '<P><U>VALOR TOTAL</U>: R$ '||:VALOR_TOTAL||'</P>';
                            CORPO1 = CORPO1 || '<P><U>VALOR DIFAL</U>: R$ '||:VALOR_TOTAL_DIFAL||'</P>';
                        
                            CORPO1 = CORPO1 || '</TBODY></TABLE>';
                        
                            CORPO1 = CORPO1 || '</BODY></HTML>';
        
                            FOR
                              SELECT EMAIL, CODIGO
                               FROM(
                                SELECT
                                    U.EMAIL,
                                    U.CODIGO
                                    FROM TBUSUARIO U, (SELECT OSPLIT AS USUARIO_ID FROM SPLIT_V2(FN_PARAMETRO('SISTEMA.USUARIOS_NOTIFICAR_DIFAL',FN_CURRENT_USER_ID()),',')) US
                                    WHERE U.CODIGO = US.USUARIO_ID
                                    AND CHAR_LENGTH(COALESCE(U.EMAIL,'')) > 0
                                )
                                INTO
                                    :EMAIL,
                                    :USUARIO_ID
                                DO BEGIN
                                    IF (CHAR_LENGTH(COALESCE(:EMAIL,'')) > 0) THEN
                                    BEGIN
                                       EXECUTE PROCEDURE SPI_NOTIFICAR_V2(
                                          CURRENT_TIMESTAMP,
                                          :USUARIO_ID,
                                          :ASSUNTO_EMAIL,
                                          :CORPO1,
                                          1,
                                          0,
                                          9
                                       );
                                    END
                                END
        
                        END
    
                END
          END
      END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_PEDIDO (
    PEDIDO integer,
    TIPO integer,
    CONFIRMACAO varchar(1),
    MOTIVO blob sub_type 0 segment size 80 = '')
as
declare variable PEDIDO_CLIENTE varchar(500);
declare variable PERFIL_PEDIDO varchar(500);
declare variable TIPO_PEDIDO varchar(500);
declare variable SUBTIPO_PEDIDO varchar(500);
declare variable CLIENTE_DESCRICAO varchar(500);
declare variable CLIENTE_AMOSTRA_DESCRICAO varchar(500);
declare variable REPRESENTANTE_DESCRICAO varchar(500);
declare variable PAGAMENTO_FORMA_DESCRICAO varchar(500);
declare variable PAGAMENTO_CONDICAO_DESCRICAO varchar(500);
declare variable VALOR_FRETE varchar(500);
declare variable FRETE_DESCRICAO varchar(500);
declare variable VALOR_TOTAL numeric(15,8);
declare variable USUARIO_ID integer;
declare variable EMAIL varchar(200);
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable CORPO2 blob sub_type 1 segment size 80;
declare variable TABELA blob sub_type 1 segment size 80;
declare variable TABELA2 blob sub_type 1 segment size 80;
declare variable ASSUNTO varchar(500);
declare variable PRODUTO_CODIGO varchar(10);
declare variable MODELO_DESCRICAO varchar(500);
declare variable PRODUTO_DESCRICAO varchar(500);
declare variable QUANTIDADE numeric(15,8);
declare variable VALOR numeric(15,8);
declare variable TAMANHO varchar(10);
declare variable TAMANHO_DESCRICAO varchar(20);
declare variable COR_DESCRICAO varchar(500);
declare variable SUB_TOTAL numeric(15,8);
declare variable VALOR_ORIGINAL numeric(15,8);
declare variable VALOR_DESCONTO numeric(15,8);
declare variable PERCENTUAL_DESCONTO numeric(15,8);
declare variable PERCENTUAL_ACRESCIMO numeric(15,8);
declare variable VALOR_ACRESCIMO numeric(15,8);
declare variable TAXA_MOEDA numeric(15,8);
declare variable VALOR_UNIT_ESTRANGEIRO numeric(15,8);
declare variable VALOR_IPI numeric(15,8);
declare variable PERCENTUAL_IPI numeric(15,8);
declare variable PERFIL_ID varchar(10);
declare variable MOEDA varchar(1);
declare variable PEDIDO_CLIENTE_ITEM varchar(20);
declare variable MOEDA_DESCRICAO varchar(10);
declare variable AUTORIZACAO_SUPERVISOR varchar(1);
declare variable AUTORIZACAO_FINANCEIRO varchar(1);
declare variable OBSERVACAO varchar(1000);
declare variable DATAHORA timestamp;
declare variable CLIENTE_CODIGO integer;
declare variable TITULO varchar(50);
declare variable REPRESENTANTE_CODIGO integer;
declare variable VALOR_ST_TOTAL numeric(15,8);
declare variable QUANTIDADE_TOTAL numeric(15,8);
declare variable ACRESCIMO_TOTAL numeric(15,8);
declare variable DESCONTO_TOTAL numeric(15,8);
declare variable VALOR_IPI_TOTAL numeric(15,8);
declare variable SITUACAO integer;
declare variable VALOR_ITENS_TOTAL numeric(15,8);
declare variable CLIENTE_TIPO_ID integer;
declare variable CONSIGNACAO varchar(1);
declare variable AMOSTRA varchar(1);
declare variable CLIENTE_SUB_TIPO_ID integer;
declare variable NOTIFICAR_PEDIDO varchar(1) = 1;
declare variable AUTOMATICO varchar(1) = 0;
BEGIN

    ASSUNTO          = 'PEDIDO ';
    TITULO           = 'PEDIDO ';
    TABELA           = '';
    TABELA2          = '';
    NOTIFICAR_PEDIDO = 1;
    AUTOMATICO       = 0;

    --NOTIFICAR
    FOR
       SELECT FIRST 1
            C.PEDIDO_CLIENTE,
            C.CLASSIFICACAO AS PERFIL_ID,
            D.ID||' - '||D.DESCRICAO AS PERFIL_PEDIDO,
            FN_LPAD(J.CODIGO, 5,0)||' - '||J.DESCRICAO   AS TIPO_PEDIDO,
            FN_LPAD(K.ID, 5,0)||' - '||K.DESCRICAO       AS SUBTIPO_PEDIDO,
            E.CODIGO AS CLIENTE_CODIGO,
            FN_LPAD(E.CODIGO, 5,0)||' - '||E.RAZAOSOCIAL AS CLIENTE_DESCRICAO,
            FN_LPAD(X.CODIGO, 5,0)||' - '||X.RAZAOSOCIAL AS CLIENTE_AMOSTRA_DESCRICAO,
            c.REPRESENTANTE_CODIGO AS REPRESENTANTE_CODIGO,
            FN_LPAD(G.CODIGO, 5,0)||' - '||G.RAZAOSOCIAL AS REPRESENTANTE_DESCRICAO,
            FN_LPAD(I.CODIGO, 4,0)||' - '||H.DESCRICAO   AS PAGAMENTO_FORMA_DESCRICAO,
            FN_LPAD(I.CODIGO, 4,0)||' - '||I.DESCRICAO   AS PAGAMENTO_CONDICAO_DESCRICAO,
            C.VALOR_FRETE AS VALOR_FRETE,
            CASE C.FRETE
                WHEN 0 THEN '0 - POR CONTA DO EMITENTE(CIF)'
                WHEN 1 THEN '1 - POR CONTA DO DESTINATÁRIO(FOB)'
                WHEN 2 THEN '2 - POR CONTA DE TERCEIROS'
                WHEN 3 THEN '3 - PRÓPRIO POR CONTA DO REMETENTE'
                WHEN 4 THEN '4 - PRÓPRIO POR CONTA DO DESTINATÁRIO'
                WHEN 9 THEN '9 - SEM FRETE'
                ELSE '9 - SEM FRETE'
            END FRETE_DESCRICAO,
            (SELECT SUM(TOTAL_GERAL)
            FROM(
                SELECT ((Z.VALOR_ACRESCIMO + Z.VALOR_IPI + ((Z.TOTAL_ITEM) * (Z.ALIQUOTA_ST / 100)) + (Z.TOTAL_ITEM)) - Z.VALOR_DESCONTO) TOTAL_GERAL,
                  Z.PEDIDO
                FROM (
                    SELECT I.PEDIDO,
                        IIF( k.UF = e.uf AND k.Substituido_Tributario = '1' and e.Substituto_Tributario = '1',
                        Coalesce((Select First 1 F.Aliquota_St From TbFamilia_Ficha F
                                        Where F.Familia_Codigo = j.Familia_Codigo
                                        and F.Estabelecimento_Codigo = E.codigo),0.00) ,0.000) Aliquota_ST,
                        COALESCE(I.VALOR_DESCONTO      ,0) AS VALOR_DESCONTO,
                        COALESCE(I.VALOR_ACRESCIMO     ,0) AS VALOR_ACRESCIMO,
                        I.VALOR_IPI,
                        I.VALOR,
                        I.QUANTIDADE,
                        FN_CALC_PRECISION(I.VALOR,I.QUANTIDADE,'*') AS TOTAL_ITEM
        
                    FROM TBPEDIDO_ITEM I
                    LEFT JOIN TBPEDIDO O
                        ON O.PEDIDO = I.PEDIDO
                    LEFT JOIN TBPERFIL P
                        ON P.ID = I.PERFIL AND P.TABELA = 'SKU'
        
                    LEFT JOIN tbcliente k
                        ON k.codigo = i.cliente_codigo
        
                    LEFT JOIN tbproduto j
                        ON j.codigo = i.produto_codigo
                    LEFT JOIN tbestabelecimento e
                        ON e.codigo = i.estabelecimento_codigo
        
                    WHERE I.PEDIDO = C.PEDIDO) Z ) Y
                    GROUP BY Y.PEDIDO) VALOR_TOTAL,
                
            (SELECT SUM(ST_VALOR)
            FROM(
                SELECT (((Z.VALOR_ACRESCIMO + Z.TOTAL_ITEM) * (Z.ALIQUOTA_ST / 100))) ST_VALOR,
                  Z.PEDIDO
                FROM (
                    SELECT I.PEDIDO,
                        IIF( k.UF = e.uf AND k.Substituido_Tributario = '1' and e.Substituto_Tributario = '1',
                        Coalesce((Select First 1 F.Aliquota_St From TbFamilia_Ficha F
                                        Where F.Familia_Codigo = j.Familia_Codigo
                                        and F.Estabelecimento_Codigo = E.codigo),0.00) ,0.000) Aliquota_ST,
                        COALESCE(I.VALOR_DESCONTO      ,0) AS VALOR_DESCONTO,
                        COALESCE(I.VALOR_ACRESCIMO     ,0) AS VALOR_ACRESCIMO,
                        I.VALOR_IPI,
                        I.VALOR,
                        I.QUANTIDADE,
                        FN_CALC_PRECISION(I.VALOR,I.QUANTIDADE,'*') AS TOTAL_ITEM
        
                    FROM TBPEDIDO_ITEM I
                    LEFT JOIN TBPEDIDO O
                        ON O.PEDIDO = I.PEDIDO
                    LEFT JOIN TBPERFIL P
                        ON P.ID = I.PERFIL AND P.TABELA = 'SKU'
        
                    LEFT JOIN tbcliente k
                        ON k.codigo = i.cliente_codigo
        
                    LEFT JOIN tbproduto j
                        ON j.codigo = i.produto_codigo
                    LEFT JOIN tbestabelecimento e
                        ON e.codigo = i.estabelecimento_codigo
        
                    WHERE I.PEDIDO = C.PEDIDO) Z ) Y
                    GROUP BY Y.PEDIDO) VALOR_ST_TOTAL,
                    (SELECT SUM(I.VALOR*I.QUANTIDADE) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO) ITEM_TOTAL,
                    (SELECT SUM(I.QUANTIDADE) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)         QUANTIDADE_TOTAL,
                    (SELECT SUM(I.VALOR_ACRESCIMO) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)    ACRESCIMO_TOTAL,
                    (SELECT SUM(I.VALOR_DESCONTO) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)     DESCONTO_TOTAL,
                    (SELECT SUM(I.VALOR_IPI) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)          VALOR_IPI_TOTAL,
                    C.USUARIO_CODIGO,
                    C.MOEDA,
                    F.CODIGO AS MOEDA_DESCRICAO,
                    c.AUTORIZACAO_SUPERVISOR,
                    c.AUTORIZACAO_FINANCEIRO,
                    C.SITUACAO,
                    c.OBSERVACAO,
                    C.USUARIO_DATA,
                    C.CLIENTE_TIPO_ID,
                    C.CLIENTE_SUB_TIPO_ID,
                    COALESCE(D.CONSIGNACAO_FITNESS,0) AS CONSIGNACAO_FITNESS,
                    COALESCE(D.AMOSTRA,0) AS AMOSTRA
            FROM TBPEDIDO C
            INNER JOIN TBPERFIL  D           ON D.ID     = C.CLASSIFICACAO and D.TABELA = 'PED'
            INNER JOIN TBCLIENTE E           ON E.CODIGO = C.CLIENTE_CODIGO
            INNER JOIN TBREPRESENTANTE G     ON G.CODIGO = C.REPRESENTANTE_CODIGO
            LEFT JOIN TBCLIENTE_TIPO    J    ON J.CODIGO = C.CLIENTE_TIPO_ID
            LEFT JOIN TBCLIENTE_SUBTIPO K    ON K.CLIENTE_TIPO_ID = J.CODIGO
            LEFT JOIN TBPAGAMENTO_FORMA H    ON H.CODIGO = C.PAGAMENTO_FORMA
            LEFT JOIN TBPAGAMENTO_CONDICAO I ON I.CODIGO = C.PAGAMENTO_CONDICAO
            LEFT JOIN TBMOEDA_ESTRANGEIRA  F ON CAST(F.ID AS VARCHAR(3)) = C.MOEDA
            LEFT JOIN TBCLIENTE            X ON X.CODIGO = C.CLIENTE_ID_AMOSTRA
            WHERE C.PEDIDO = :PEDIDO
    INTO
        PEDIDO_CLIENTE,
        PERFIL_ID,
        PERFIL_PEDIDO,
        TIPO_PEDIDO,
        SUBTIPO_PEDIDO,
        CLIENTE_CODIGO,
        CLIENTE_DESCRICAO,
        CLIENTE_AMOSTRA_DESCRICAO,
        REPRESENTANTE_CODIGO,
        REPRESENTANTE_DESCRICAO,
        PAGAMENTO_FORMA_DESCRICAO,
        PAGAMENTO_CONDICAO_DESCRICAO,
        VALOR_FRETE,
        FRETE_DESCRICAO,
        VALOR_TOTAL,
        VALOR_ST_TOTAL,
        VALOR_ITENS_TOTAL,
        QUANTIDADE_TOTAL,
        ACRESCIMO_TOTAL,
        DESCONTO_TOTAL,
        VALOR_IPI_TOTAL,
        USUARIO_ID,
        MOEDA,
        MOEDA_DESCRICAO,
        AUTORIZACAO_SUPERVISOR,
        AUTORIZACAO_FINANCEIRO,
        SITUACAO,
        OBSERVACAO,
        DATAHORA,
        CLIENTE_TIPO_ID,
        CLIENTE_SUB_TIPO_ID,
        CONSIGNACAO,
        AMOSTRA
    DO BEGIN

        IF(:MOEDA = '1') THEN
        BEGIN
            --EXCEPTION "..." 'SIT 1';
            TABELA = '<TABLE BORDERCOLOR="BLACK" BORDERCOLORLIGHT="#33CCFF" BORDER="5" STYLE="BORDER: 1PX SOLID; BORDER-SPACING: 1PX; BORDER-COLLAPSE: COLLAPSE;" CLASS="TBL"><THEAD STYLE="BACKGROUND-COLOR: #337AB7;COLOR: WHITE;"><TR>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-1">PRODUTO</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-2">QTD</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">VR.UNIT(R$)</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-4">SUB TOTAL</TH>'||
                      '</TR></THEAD><TBODY>';
        END
        IF(:MOEDA <> '1') THEN
        BEGIN
            --EXCEPTION "..." 'SIT 1-2';
            TABELA = '<TABLE BORDERCOLOR="BLACK" BORDERCOLORLIGHT="#33CCFF" BORDER="5" STYLE="BORDER: 1PX SOLID; BORDER-SPACING: 1PX; BORDER-COLLAPSE: COLLAPSE;" CLASS="TBL"><THEAD STYLE="BACKGROUND-COLOR: #337AB7;COLOR: WHITE;"><TR>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-1">PRODUTO</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-2">QTD</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">TAXA</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">VR.UNIT('||COALESCE(:MOEDA_DESCRICAO,'')||')</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">VR.UNIT(R$)</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-4">SUB TOTAL</TH>'||
                      '</TR></THEAD><TBODY>';
        END

            TABELA2 = '<TABLE BORDERCOLOR="BLACK" BORDERCOLORLIGHT="#33CCFF" BORDER="5" STYLE="BORDER: 1PX SOLID; BORDER-SPACING: 1PX; BORDER-COLLAPSE: COLLAPSE;" CLASS="TBL"><THEAD STYLE="BACKGROUND-COLOR: #337AB7;COLOR: WHITE;">'||
                ' <TR>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: CENTER;" COLSPAN="8" CLASS="COL-1">TOTAIS</TD>'||
                ' </TR></THEAD><TBODY>'||
                ' <TR>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">QTD.TOTAL</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">SUB-TOTAL</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">ACRÉSCIMO</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">DESCONTO</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">IPI</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">SUBST.TRIB</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">FRETE</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">VALOR TOTAL</TD>'||
                ' </TR>'||
                ' <TR>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> '||     COALESCE(FN_FORMAT_NUMBER2(:QUANTIDADE_TOTAL ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_ITENS_TOTAL,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:ACRESCIMO_TOTAL  ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:DESCONTO_TOTAL   ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_IPI_TOTAL  ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_ST_TOTAL   ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_FRETE      ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_TOTAL      ,2),'')||'</TD>'||
                ' </TR>';

        if(:tipo = 1)then
        /*PEDIDO EM CONFIRMAÇÃO/REPROVAÇÃO PELO COMERCIAL*/
        begin
           if(:CONFIRMACAO = 1)THEN
           BEGIN
           --reprovado
           ASSUNTO = ASSUNTO||:PEDIDO||' APROVADO PELO SETOR COMERCIAL';
           TITULO  = TITULO||:PEDIDO||' APROVADO(COMERCIAL)';
           END
           if(:CONFIRMACAO = 2)THEN
           BEGIN
           --aprovado e confirmado
           ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMADO PELO SETOR COMERCIAL';
           TITULO  = TITULO||:PEDIDO||' CONFIRMADO(COMERCIAL)';
           END               
           if(:CONFIRMACAO = 3)THEN
           BEGIN
           ASSUNTO = ASSUNTO||:PEDIDO||' REPROVADO PELO SETOR COMERCIAL';
           TITULO  = TITULO||:PEDIDO||' REPROVADO(COMERCIAL)';
           --aprovado e não confirmado
           END               
           if(:CONFIRMACAO = 4)THEN
           BEGIN
           ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMAÇÃO CANCELADA PELO SETOR COMERCIAL';
           TITULO  = TITULO||:PEDIDO||' CONFIRMAÇÃO CANCELADA(COMERCIAL)';
           --aprovado e não confirmado
           END
        end

        if(:tipo = 2)then
        /*PEDIDO EM CONFIRMAÇÃO/REPROVAÇÃO PELO FINANCEIRO*/
        begin
          if(:CONFIRMACAO = 1)THEN
           BEGIN
           --reprovado
           ASSUNTO = ASSUNTO||:PEDIDO||' APROVADO PELO SETOR FINANCEIRO';
           TITULO  = TITULO||:PEDIDO||' APROVADO(FINANCEIRO)';
           END
           if(:CONFIRMACAO = 2)THEN
           BEGIN
           --aprovado e confirmado
           ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMADO PELO SETOR FINANCEIRO';
           TITULO  = TITULO||:PEDIDO||' CONFIRMADO(FINANCEIRO)';
           END               
           if(:CONFIRMACAO = 3)THEN
           BEGIN
           ASSUNTO = ASSUNTO||:PEDIDO||' REPROVADO PELO SETOR FINANCEIRO';
           TITULO  = TITULO||:PEDIDO||' REPROVADO(FINANCEIRO)';
           --aprovado e não confirmado
           END                 
           if(:CONFIRMACAO = 4)THEN
           BEGIN
           ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMAÇÃO CANCELADA PELO SETOR FINANCEIRO';
           TITULO  = TITULO||:PEDIDO||' CONFIRMAÇÃO CANCELADA(FINANCEIRO)';
           --aprovado e não confirmado
           END
        end

        if(:tipo = 0)then
        /*PEDIDO SENDO INCLUIDO OU ALTERADO*/
        begin
           if(:confirmacao = 0)then
           BEGIN
              ASSUNTO = ASSUNTO||:PEDIDO||' ALTERADO';
              TITULO  = TITULO||:PEDIDO||' ALTERADO';
           END
           if(:confirmacao = 1)then
           BEGIN
              ASSUNTO = ASSUNTO||:PEDIDO||' INCLUIDO';
              TITULO  = TITULO||:PEDIDO||' INCLUIDO';
           END
           if(:AUTORIZACAO_SUPERVISOR = 1 OR :AUTORIZACAO_FINANCEIRO = 1)THEN
           BEGIN
              ASSUNTO = ASSUNTO||' PENDENTE DE CONFIRMAÇÃO(';
              TITULO  = TITULO||'(PENDENTE)';
              if(:AUTORIZACAO_SUPERVISOR = 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
              BEGIN
                ASSUNTO = ASSUNTO||'COMERCIAL';
              END
              if(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO = 1)THEN
              BEGIN
                ASSUNTO = ASSUNTO||'FINANCEIRO';
              END
              if(:AUTORIZACAO_SUPERVISOR = 1  AND :AUTORIZACAO_FINANCEIRO = 1)THEN
              BEGIN
                ASSUNTO = ASSUNTO||'COMERCIAL, FINANCEIRO';
              END
              ASSUNTO = ASSUNTO||')';
           END
           if(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
           BEGIN
              ASSUNTO = ASSUNTO||' APROVADO';
              if(:SITUACAO = 1)then
              begin
                 ASSUNTO = ASSUNTO||' AUTOMATICAMENTE';
                 TITULO  = TITULO||'(APROVADO AUTOMATICAMENTE)';
                 AUTOMATICO = 1;
                 NOTIFICAR_PEDIDO = COALESCE((SELECT FN_PARAMETRO('SISTEMA.NOTIFICAR_PEDIDO_AUT') FROM RDB$DATABASE),0);
              end
              ELSE
              BEGIN
                 TITULO  = TITULO||'(APROVADO)';
              END
           END
        END

        FOR SELECT
                FN_LPAD(I.PRODUTO_CODIGO,6,0) AS PRODUTO_CODIGO,
                J.DESCRICAO AS PRODUTO_DESCRICAO,
                (SELECT FIRST 1 M.DESCRICAO
                    FROM TBMODELO M
                    WHERE M.CODIGO = I.MODELO_CODIGO
                ) MODELO_DESCRICAO,
            
                I.QUANTIDADE,
                I.VALOR,
            
                FN_LPAD(I.TAMANHO,2,0) AS TAMANHO,
            
                (SELECT FIRST 1 TAM_DESCRICAO
                    FROM SP_TAMANHO_GRADE(
                        (SELECT FIRST 1 PROD.GRADE_CODIGO FROM TBPRODUTO PROD WHERE PROD.CODIGO = I.PRODUTO_CODIGO),
                        I.TAMANHO
                    )
                ) TAMANHO_DESCRICAO,
                FN_LPAD(I.COR_ID,5,0)||' - '||
                (SELECT FIRST 1 C.DESCRICAO
                    FROM TBCOR C
                    WHERE C.CODIGO = I.COR_ID
                ) COR_DESCRICAO,
                (I.VALOR * I.QUANTIDADE) AS SUB_TOTAL,
                coalesce(VALOR_ORIGINAL      ,0) AS VALOR_ORIGINAL,
                COALESCE(VALOR_DESCONTO      ,0) AS VALOR_DESCONTO,
                COALESCE(PERCENTUAL_DESCONTO ,0) AS PERCENTUAL_DESCONTO,
                COALESCE(PERCENTUAL_ACRESCIMO,0) AS PERCENTUAL_ACRESCIMO,
                COALESCE(VALOR_ACRESCIMO     ,0) AS VALOR_ACRESCIMO,
                I.TAXA_MOEDA,
                I.VALOR_UNIT_ESTRANGEIRO,
                I.VALOR_IPI,
                I.PERCENTUAL_IPI,
                I.PEDIDO_CLIENTE
            
            FROM
             TBPEDIDO_ITEM I
                LEFT JOIN TBPEDIDO O
                    ON O.PEDIDO = I.PEDIDO
                LEFT JOIN TBPERFIL P
                    ON P.ID = I.PERFIL and p.tabela = 'SKU'
                LEFT JOIN TBMODELO_BLOQUEIO MB
                    ON MB.PERFIL = P.ID
                    AND MB.MODELO_ID= I.MODELO_CODIGO
                    AND MB.COR_ID  = I.COR_ID
                    AND MB.TAMANHO = I.TAMANHO
                LEFT JOIN TBMODELO_PEDIDO_COTA MPC
                    ON MPC.MODELO_ID = MB.MODELO_ID
                LEFT JOIN tbcliente k
                    ON k.codigo = i.cliente_codigo
                LEFT JOIN tbproduto j
                    ON j.codigo = i.produto_codigo
                LEFT JOIN tbestabelecimento e
                    ON e.codigo = i.estabelecimento_codigo
                LEFT JOIN TBMOEDA_ESTRANGEIRA V
                    ON V.ID = O.MOEDA
            
            WHERE I.PEDIDO = :PEDIDO
            INTO PRODUTO_CODIGO,
                PRODUTO_DESCRICAO,
                MODELO_DESCRICAO,
                QUANTIDADE,
                VALOR,
                TAMANHO,
                TAMANHO_DESCRICAO,
                COR_DESCRICAO,
                SUB_TOTAL,
                VALOR_ORIGINAL,
                VALOR_DESCONTO,
                PERCENTUAL_DESCONTO,
                PERCENTUAL_ACRESCIMO,
                VALOR_ACRESCIMO,
                TAXA_MOEDA,
                VALOR_UNIT_ESTRANGEIRO,
                VALOR_IPI,
                PERCENTUAL_IPI,
                PEDIDO_CLIENTE_ITEM DO
                BEGIN
                    IF(:MOEDA = '1') THEN
                    BEGIN
                        TABELA = TABELA||'<TR CLASS="--">';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; OVERFLOW: HIDDEN; TEXT-OVERFLOW: ELLIPSIS; WHITE-SPACE: NOWRAP;" CLASS="COL-STRING" ID="COL-STRING">' ||COALESCE(:PRODUTO_CODIGO,'')||'/'||COALESCE(:TAMANHO,'')||' - '||COALESCE(:PRODUTO_DESCRICAO,'')||' TAM.'||COALESCE(:TAMANHO_DESCRICAO,'')||' </TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(FN_FORMAT_NUMBER2(:QUANTIDADE,2),'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR,2) ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:SUB_TOTAL,2)  ,'')||'</TD>';
                        TABELA = TABELA||'</TR>';
                        -- EXCEPTION "..." 'SIT 2-1';
                    END
                    IF(:MOEDA <> '1') THEN
                    BEGIN
                        TABELA = TABELA||'<TR CLASS="--">';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; OVERFLOW: HIDDEN; TEXT-OVERFLOW: ELLIPSIS; WHITE-SPACE: NOWRAP;" CLASS="COL-STRING" ID="COL-STRING">' ||COALESCE(:PRODUTO_CODIGO,'')||'/'||COALESCE(:TAMANHO,'')||' - '||COALESCE(:PRODUTO_DESCRICAO,'')||' TAM.'||COALESCE(:TAMANHO_DESCRICAO,'')||' </TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(FN_FORMAT_NUMBER2(:QUANTIDADE,2)     ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> ' || COALESCE(FN_FORMAT_NUMBER2(:TAXA_MOEDA,2)    ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> '||COALESCE(:MOEDA_DESCRICAO,'')||' '||COALESCE(FN_FORMAT_NUMBER2(:VALOR_UNIT_ESTRANGEIRO,2),'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR,2)   ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:SUB_TOTAL,2),'')||'</TD>';
                        TABELA = TABELA||'</TR>';
                       -- EXCEPTION "..." TABELA;
                    END

                END
    END

    CORPO1 = '<HTML><HEAD><META CHARSET="CONTENT-TYPE: TEXT/HTML; CHARSET=UTF-8"><STYLE>P {MARGIN: 2PX;}</STYLE></HEAD><BODY>';
    CORPO1 = CORPO1 || '<P></P>';
    CORPO1 = CORPO1 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_12201?PEDIDO='||:PEDIDO,'')||'" TARGET="_BLANK">[ABRIR NA WEB]</A></P>';
--    CORPO1 = CORPO1 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_12360?CLIENTE_ID='||:CLIENTE_CODIGO,'')||'" TARGET="_BLANK">[ABRIR CLIENTE NA WEB]</A></P>';
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || '<P STYLE="FONT-WEIGHT: BOLD;"><U>PEDIDO: '||COALESCE(:PEDIDO,'')||'</U></P>';
    CORPO1 = CORPO1 || '<P><U>PERFIL</U>: '||COALESCE(:PERFIL_PEDIDO,'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>TIPO DO PEDIDO</U>: '||COALESCE(:TIPO_PEDIDO,'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>TIPO DO CLIENTE</U>: '||COALESCE(:SUBTIPO_PEDIDO,'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>CLIENTE</U>: '||COALESCE(:CLIENTE_DESCRICAO,'')||'</P>';
    IF(:AMOSTRA = 1)THEN
    BEGIN
      CORPO1 = CORPO1 || '<P><U>CLIENTE AMOSTRA</U>: '||COALESCE(:CLIENTE_AMOSTRA_DESCRICAO,'')||'</P>';
    END
    CORPO1 = CORPO1 || '<P><U>REPRESENTANTE</U>: '||COALESCE(:REPRESENTANTE_DESCRICAO,'')||'</P>';
    
    IF(:AMOSTRA = 0 AND :CONSIGNACAO = 0)THEN
    BEGIN
       CORPO1 = CORPO1 || '<P><U>FORMA DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_FORMA_DESCRICAO,'')||'</P>';
       CORPO1 = CORPO1 || '<P><U>CONDIÇÃO DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_CONDICAO_DESCRICAO,'')||'</P>';
    END
    CORPO1 = CORPO1 || '<P><U>DIGITADO POR</U>: '||COALESCE((SELECT UPPER(COALESCE(U.NOME, U.USUARIO)) FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID),'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>DATA/HORA INCLUSÃO DO PEDIDO:</U>: '||COALESCE(FORMATDATETIME(:DATAHORA),'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>OBSERVAÇÃO</U>: '||COALESCE(:OBSERVACAO,'')||'</P>';
    if(:AUTORIZACAO_SUPERVISOR = 2)then
    /*PEDIDO SENDO REPROVADO*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE REPROVAÇÃO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 1 AND S.STATUS = 2 ORDER BY S.ID DESC),'')||'</P>';
    END

    if(:AUTORIZACAO_FINANCEIRO = 2)then
    /*PEDIDO TENDO REPROVADO*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE REPROVAÇÃO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 2 AND S.STATUS = 2 ORDER BY S.ID DESC),'')||'</P>';
    END

    if(:AUTORIZACAO_SUPERVISOR = 1 AND :CONFIRMACAO = 4)then
    /*PEDIDO TENDO CONFIRMAÇÃO CANCELADA PELO COMERCIAL*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE CANCELAMENTO DE CONFIRMAÇÃO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 1 and s.status = 1 ORDER BY S.ID DESC),'')||'</P>';
    END

    if(:AUTORIZACAO_FINANCEIRO = 1 AND :CONFIRMACAO = 4)then
    /*PEDIDO TENDO CONFIRMAÇÃO CANCELADA PELO FINANCEIRO*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE CANCELAMENTO DE CONFIRMAÇÃO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 2 and s.status = 1 ORDER BY S.ID DESC),'')||'</P>';
    END
    IF(:MOTIVO IS NOT NULL AND CHAR_LENGTH(:MOTIVO) > 0)THEN
    BEGIN
       CORPO1 = CORPO1 ||UPPER(:MOTIVO);
    END
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || TABELA;
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || TABELA2;

    CORPO1 = CORPO1 || '</TBODY></TABLE>';
    /*SE HOUVER MOTIVO DEVE SER ADICIONADO NO EMAIL APÓS A TABELA E SEU RESUMO*/

    CORPO1 = CORPO1 || '</BODY></HTML>';
   -- EXCEPTION "..." CORPO1;
    CORPO2 = '<HTML><HEAD><META CHARSET="CONTENT-TYPE: TEXT/HTML; CHARSET=UTF-8"><STYLE>P {MARGIN: 2PX;}</STYLE></HEAD><BODY>';
    CORPO2 = CORPO2 || '<P></P>';
    CORPO2 = CORPO2 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_12201?PEDIDO='||:PEDIDO,'')||'" TARGET="_BLANK">[ABRIR NA WEB]</A></P>';
    CORPO2 = CORPO2 || '<BR>';
    CORPO2 = CORPO2 || '<P STYLE="FONT-WEIGHT: BOLD;"><U>PEDIDO: '||COALESCE(:PEDIDO,'')||'</U></P>';
    CORPO2 = CORPO2 || '<P><U>PERFIL</U>: '||COALESCE(:PERFIL_PEDIDO,'')||'</P>';
    CORPO2 = CORPO2 || '<P><U>TIPO DO PEDIDO</U>: '||COALESCE(:TIPO_PEDIDO,'')||'</P>';
    CORPO2 = CORPO2 || '<P><U>TIPO DO CLIENTE</U>: '||COALESCE(:SUBTIPO_PEDIDO,'')||'</P>';
    CORPO2 = CORPO2 || '<P><U>CLIENTE</U>: '||COALESCE(:CLIENTE_DESCRICAO,'')||'</P>';
    IF(:AMOSTRA = 1)THEN
    BEGIN
      CORPO2 = CORPO2 || '<P><U>CLIENTE AMOSTRA</U>: '||COALESCE(:CLIENTE_AMOSTRA_DESCRICAO,'')||'</P>';
    END
    CORPO2 = CORPO2 || '<P><U>REPRESENTANTE</U>: '||COALESCE(:REPRESENTANTE_DESCRICAO,'')||'</P>';
    
    IF(:AMOSTRA = 0 AND :CONSIGNACAO = 0)THEN
    BEGIN
       CORPO2 = CORPO2 || '<P><U>FORMA DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_FORMA_DESCRICAO,'')||'</P>';
       CORPO2 = CORPO2 || '<P><U>CONDIÇÃO DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_CONDICAO_DESCRICAO,'')||'</P>';
    END

    CORPO2 = CORPO2 || '<BR>';
    CORPO2 = CORPO2 || '<P>PARA DETALHAMENTO, VERIFIQUE SEU E-MAIL OU CLIQUE NO LINK ACIMA.</P>';
    CORPO2 = CORPO2 || '</BODY></HTML>';

    IF(COALESCE(:PEDIDO,0) > 0 AND (NOTIFICAR_PEDIDO = 1 AND AUTOMATICO = 1 or NOTIFICAR_PEDIDO = 1 AND AUTOMATICO = 0))THEN
    BEGIN
        --EXCEPTION "..." ASSUNTO;
        FOR
--           SELECT
--                U.EMAIL,
--                U.CODIGO
--            FROM TBUSUARIO U
--            WHERE (U.CODIGO = :USUARIO_ID
--            or (U.CODIGO IN (SELECT N.USUARIO_ID FROM TBPERFIL_PEDIDO_CONF_USER N WHERE N.PERFIL = :PERFIL_ID AND (IIF((:TIPO > 0),N.TIPO = :TIPO,N.TIPO IN (1,2)))))
--            --or (u.REPRESENTANTE_ID = :REPRESENTANTE_CODIGO)
--            )
        SELECT EMAIL,
            CODIGO FROM(
        SELECT
            U.EMAIL,
            U.CODIGO
            FROM TBUSUARIO U
        WHERE (U.CODIGO = :USUARIO_ID
        or (U.CODIGO IN (SELECT N.USUARIO_ID FROM TBPERFIL_PEDIDO_CONF_USER N WHERE N.PERFIL = :PERFIL_ID AND (IIF((:TIPO > 0),N.TIPO = :TIPO,N.TIPO IN (1,2))))))
        AND CHAR_LENGTH(COALESCE(U.EMAIL,'')) > 0
        UNION
        SELECT
         Z.EMAIL,
         0 AS CODIGO
        FROM TBEMPRESA Z WHERE Z.CODIGO = :REPRESENTANTE_CODIGO
        AND CHAR_LENGTH(COALESCE(Z.EMAIL,'')) > 0
        AND Z.EMAIL NOT IN (SELECT
            U.EMAIL
            FROM TBUSUARIO U
        WHERE (U.CODIGO = :USUARIO_ID
        or (U.CODIGO IN (SELECT N.USUARIO_ID FROM TBPERFIL_PEDIDO_CONF_USER N WHERE N.PERFIL = :PERFIL_ID AND (IIF((:TIPO > 0),N.TIPO = :TIPO,N.TIPO IN (1,2))))))
        AND CHAR_LENGTH(COALESCE(U.EMAIL,'')) > 0))
        INTO
            :EMAIL,
            :USUARIO_ID
        DO BEGIN
            if (CHAR_LENGTH(COALESCE(:EMAIL,'')) > 0) then
            BEGIN
               
              -- EXCEPTION "..." TABELA;
               EXECUTE PROCEDURE SPI_NOTIFICAR_V2(
                  CURRENT_TIMESTAMP,
                  :USUARIO_ID,
                  :ASSUNTO,
                  :CORPO1,
                  1,
                  0,
                  5
               );
        
               EXECUTE PROCEDURE SPI_NOTIFICAR_V2(
                  CURRENT_TIMESTAMP,
                  :USUARIO_ID,
                  :TITULO,
                  :CORPO2,
                  0,
                  1,
                  5
               );
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_PEDIDO2 (
    PEDIDO integer,
    TIPO integer,
    CONFIRMACAO varchar(1),
    MOTIVO blob sub_type 0 segment size 80 = '',
    INCLUSAO integer = 0)
as
declare variable PEDIDO_CLIENTE varchar(500);
declare variable PERFIL_PEDIDO varchar(500);
declare variable TIPO_PEDIDO varchar(500);
declare variable SUBTIPO_PEDIDO varchar(500);
declare variable CLIENTE_DESCRICAO varchar(500);
declare variable CLIENTE_AMOSTRA_DESCRICAO varchar(500);
declare variable REPRESENTANTE_DESCRICAO varchar(500);
declare variable PAGAMENTO_FORMA_DESCRICAO varchar(500);
declare variable PAGAMENTO_CONDICAO_DESCRICAO varchar(500);
declare variable VALOR_FRETE varchar(500);
declare variable FRETE_DESCRICAO varchar(500);
declare variable VALOR_TOTAL numeric(15,8);
declare variable USUARIO_ID integer;
declare variable EMAIL varchar(200);
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable CORPO2 blob sub_type 1 segment size 80;
declare variable TABELA blob sub_type 1 segment size 80;
declare variable TABELA2 blob sub_type 1 segment size 80;
declare variable ASSUNTO varchar(500);
declare variable PRODUTO_CODIGO varchar(10);
declare variable MODELO_DESCRICAO varchar(500);
declare variable PRODUTO_DESCRICAO varchar(500);
declare variable QUANTIDADE numeric(15,8);
declare variable VALOR numeric(15,8);
declare variable TAMANHO varchar(10);
declare variable TAMANHO_DESCRICAO varchar(20);
declare variable COR_DESCRICAO varchar(500);
declare variable SUB_TOTAL numeric(15,8);
declare variable VALOR_ORIGINAL numeric(15,8);
declare variable VALOR_DESCONTO numeric(15,8);
declare variable PERCENTUAL_DESCONTO numeric(15,8);
declare variable PERCENTUAL_ACRESCIMO numeric(15,8);
declare variable VALOR_ACRESCIMO numeric(15,8);
declare variable TAXA_MOEDA numeric(15,8);
declare variable VALOR_UNIT_ESTRANGEIRO numeric(15,8);
declare variable VALOR_IPI numeric(15,8);
declare variable PERCENTUAL_IPI numeric(15,8);
declare variable PERFIL_ID varchar(10);
declare variable MOEDA varchar(1);
declare variable PEDIDO_CLIENTE_ITEM varchar(20);
declare variable MOEDA_DESCRICAO varchar(10);
declare variable AUTORIZACAO_SUPERVISOR varchar(1);
declare variable AUTORIZACAO_FINANCEIRO varchar(1);
declare variable OBSERVACAO varchar(1000);
declare variable DATAHORA timestamp;
declare variable CLIENTE_CODIGO integer;
declare variable TITULO varchar(50);
declare variable REPRESENTANTE_CODIGO integer;
declare variable VALOR_ST_TOTAL numeric(15,8);
declare variable QUANTIDADE_TOTAL numeric(15,8);
declare variable ACRESCIMO_TOTAL numeric(15,8);
declare variable DESCONTO_TOTAL numeric(15,8);
declare variable VALOR_IPI_TOTAL numeric(15,8);
declare variable SITUACAO integer;
declare variable VALOR_ITENS_TOTAL numeric(15,8);
declare variable CLIENTE_TIPO_ID integer;
declare variable CONSIGNACAO varchar(1);
declare variable AMOSTRA varchar(1);
declare variable CLIENTE_SUB_TIPO_ID integer;
declare variable NOTIFICAR_PEDIDO varchar(1) = 1;
declare variable AUTOMATICO varchar(1) = 0;
BEGIN
 in autonomous transaction
 do
    ASSUNTO          = 'PEDIDO ';
    TITULO           = 'PEDIDO ';
    TABELA           = '';
    TABELA2          = '';
    NOTIFICAR_PEDIDO = 1;
    AUTOMATICO       = 0;

    --NOTIFICAR
    FOR
       SELECT FIRST 1
            C.PEDIDO_CLIENTE,
            C.CLASSIFICACAO AS PERFIL_ID,
            D.ID||' - '||D.DESCRICAO AS PERFIL_PEDIDO,
            FN_LPAD(J.CODIGO, 5,0)||' - '||J.DESCRICAO   AS TIPO_PEDIDO,
            FN_LPAD(K.ID, 5,0)||' - '||K.DESCRICAO       AS SUBTIPO_PEDIDO,
            E.CODIGO AS CLIENTE_CODIGO,
            FN_LPAD(E.CODIGO, 5,0)||' - '||E.RAZAOSOCIAL||'('||E.UF||')' AS CLIENTE_DESCRICAO,
            FN_LPAD(X.CODIGO, 5,0)||' - '||X.RAZAOSOCIAL AS CLIENTE_AMOSTRA_DESCRICAO,
            C.REPRESENTANTE_CODIGO,
            FN_LPAD(G.CODIGO, 5,0)||' - '||G.RAZAOSOCIAL AS REPRESENTANTE_DESCRICAO,
            FN_LPAD(I.CODIGO, 4,0)||' - '||H.DESCRICAO   AS PAGAMENTO_FORMA_DESCRICAO,
            FN_LPAD(I.CODIGO, 4,0)||' - '||I.DESCRICAO   AS PAGAMENTO_CONDICAO_DESCRICAO,
            C.VALOR_FRETE AS VALOR_FRETE,
            CASE C.FRETE
                WHEN 0 THEN '0 - POR CONTA DO EMITENTE(CIF)'
                WHEN 1 THEN '1 - POR CONTA DO DESTINATARIO(FOB)'
                WHEN 2 THEN '2 - POR CONTA DE TERCEIROS'
                WHEN 3 THEN '3 - PROPRIO POR CONTA DO REMETENTE'
                WHEN 4 THEN '4 - PROPRIO POR CONTA DO DESTINATARIO'
                WHEN 9 THEN '9 - SEM FRETE'
                ELSE '9 - SEM FRETE'
            END FRETE_DESCRICAO,
            (SELECT SUM(TOTAL_GERAL)
            FROM(
                SELECT ((Z.VALOR_ACRESCIMO + Z.VALOR_IPI + ((Z.TOTAL_ITEM) * (Z.ALIQUOTA_ST / 100)) + (Z.TOTAL_ITEM)) - Z.VALOR_DESCONTO) TOTAL_GERAL,
                  Z.PEDIDO
                FROM (
                    SELECT I.PEDIDO,
                        IIF( k.UF = e.uf AND k.Substituido_Tributario = '1' and e.Substituto_Tributario = '1',
                        Coalesce((Select First 1 F.Aliquota_St From TbFamilia_Ficha F
                                        Where F.Familia_Codigo = j.Familia_Codigo
                                        and F.Estabelecimento_Codigo = E.codigo),0.00) ,0.000) Aliquota_ST,
                        COALESCE(I.VALOR_DESCONTO      ,0) AS VALOR_DESCONTO,
                        COALESCE(I.VALOR_ACRESCIMO     ,0) AS VALOR_ACRESCIMO,
                        I.VALOR_IPI,
                        I.VALOR,
                        I.QUANTIDADE,
                        FN_CALC_PRECISION(I.VALOR,I.QUANTIDADE,'*') AS TOTAL_ITEM
        
                    FROM TBPEDIDO_ITEM I
                    LEFT JOIN TBPEDIDO O
                        ON O.PEDIDO = I.PEDIDO
                    LEFT JOIN TBPERFIL P
                        ON P.ID = I.PERFIL AND P.TABELA = 'SKU'
        
                    LEFT JOIN tbcliente k
                        ON k.codigo = i.cliente_codigo
        
                    LEFT JOIN tbproduto j
                        ON j.codigo = i.produto_codigo
                    LEFT JOIN tbestabelecimento e
                        ON e.codigo = i.estabelecimento_codigo
        
                    WHERE I.PEDIDO = C.PEDIDO) Z ) Y
                    GROUP BY Y.PEDIDO) VALOR_TOTAL,
                
            (SELECT SUM(ST_VALOR)
            FROM(
                SELECT (((Z.VALOR_ACRESCIMO + Z.TOTAL_ITEM) * (Z.ALIQUOTA_ST / 100.00))) ST_VALOR,
                  Z.PEDIDO
                FROM (
                    SELECT I.PEDIDO,
                        IIF( k.UF = e.uf AND k.Substituido_Tributario = '1' and e.Substituto_Tributario = '1',
                        Coalesce((Select First 1 F.Aliquota_St From TbFamilia_Ficha F
                                        Where F.Familia_Codigo = j.Familia_Codigo
                                        and F.Estabelecimento_Codigo = E.codigo),0.00) ,0.000) Aliquota_ST,
                        COALESCE(I.VALOR_DESCONTO      ,0) AS VALOR_DESCONTO,
                        COALESCE(I.VALOR_ACRESCIMO     ,0) AS VALOR_ACRESCIMO,
                        I.VALOR_IPI,
                        I.VALOR,
                        I.QUANTIDADE,
                        FN_CALC_PRECISION(I.VALOR,I.QUANTIDADE,'*') AS TOTAL_ITEM
        
                    FROM (SELECT I.* FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO) I
                    LEFT JOIN TBPEDIDO O
                        ON O.PEDIDO = I.PEDIDO
                    LEFT JOIN TBPERFIL P
                        ON P.ID = I.PERFIL AND P.TABELA = 'SKU'
                    LEFT JOIN tbcliente k
                        ON k.codigo = i.cliente_codigo
                    LEFT JOIN tbproduto j
                        ON j.codigo = i.produto_codigo
                    LEFT JOIN tbestabelecimento e
                        ON e.codigo = i.estabelecimento_codigo
        
                    WHERE I.PEDIDO = C.PEDIDO) Z ) Y
                    GROUP BY Y.PEDIDO) VALOR_ST_TOTAL,
                    (SELECT SUM(I.VALOR*I.QUANTIDADE) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO) ITEM_TOTAL,
                    (SELECT SUM(I.QUANTIDADE) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)         QUANTIDADE_TOTAL,
                    (SELECT SUM(I.VALOR_ACRESCIMO) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)    ACRESCIMO_TOTAL,
                    (SELECT SUM(I.VALOR_DESCONTO) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)     DESCONTO_TOTAL,
                    (SELECT SUM(I.VALOR_IPI) FROM TBPEDIDO_ITEM I WHERE I.PEDIDO = C.PEDIDO)          VALOR_IPI_TOTAL,
                    C.USUARIO_CODIGO,
                    C.MOEDA,
                    F.CODIGO AS MOEDA_DESCRICAO,
                    c.AUTORIZACAO_SUPERVISOR,
                    c.AUTORIZACAO_FINANCEIRO,
                    C.SITUACAO,
                    c.OBSERVACAO,
                    C.USUARIO_DATA,
                    C.CLIENTE_TIPO_ID,
                    C.CLIENTE_SUB_TIPO_ID,
                    COALESCE(D.CONSIGNACAO_FITNESS,0) AS CONSIGNACAO_FITNESS,
                    COALESCE(D.AMOSTRA,0) AS AMOSTRA
            FROM ( SELECT C.* FROM TBPEDIDO C WHERE C.PEDIDO = :PEDIDO ) C
            INNER JOIN TBPERFIL  D           ON D.ID     = C.CLASSIFICACAO and D.TABELA = 'PED'
            INNER JOIN TBCLIENTE E           ON E.CODIGO = C.CLIENTE_CODIGO
            INNER JOIN TBREPRESENTANTE G     ON G.CODIGO = C.REPRESENTANTE_CODIGO
            LEFT JOIN TBCLIENTE_TIPO    J    ON J.CODIGO = C.CLIENTE_TIPO_ID
            LEFT JOIN TBCLIENTE_SUBTIPO K    ON K.CLIENTE_TIPO_ID = J.CODIGO
            LEFT JOIN TBPAGAMENTO_FORMA H    ON H.CODIGO = C.PAGAMENTO_FORMA
            LEFT JOIN TBPAGAMENTO_CONDICAO I ON I.CODIGO = C.PAGAMENTO_CONDICAO
            LEFT JOIN TBMOEDA_ESTRANGEIRA  F ON CAST(F.ID AS VARCHAR(3)) = C.MOEDA
            LEFT JOIN TBCLIENTE            X ON X.CODIGO = C.CLIENTE_ID_AMOSTRA
    INTO
        PEDIDO_CLIENTE,
        PERFIL_ID,
        PERFIL_PEDIDO,
        TIPO_PEDIDO,
        SUBTIPO_PEDIDO,
        CLIENTE_CODIGO,
        CLIENTE_DESCRICAO,
        CLIENTE_AMOSTRA_DESCRICAO,
        REPRESENTANTE_CODIGO,
        REPRESENTANTE_DESCRICAO,
        PAGAMENTO_FORMA_DESCRICAO,
        PAGAMENTO_CONDICAO_DESCRICAO,
        VALOR_FRETE,
        FRETE_DESCRICAO,
        VALOR_TOTAL,
        VALOR_ST_TOTAL,
        VALOR_ITENS_TOTAL,
        QUANTIDADE_TOTAL,
        ACRESCIMO_TOTAL,
        DESCONTO_TOTAL,
        VALOR_IPI_TOTAL,
        USUARIO_ID,
        MOEDA,
        MOEDA_DESCRICAO,
        AUTORIZACAO_SUPERVISOR,
        AUTORIZACAO_FINANCEIRO,
        SITUACAO,
        OBSERVACAO,
        DATAHORA,
        CLIENTE_TIPO_ID,
        CLIENTE_SUB_TIPO_ID,
        CONSIGNACAO,
        AMOSTRA
    DO BEGIN

        IF(:MOEDA = '1') THEN
        BEGIN
            --EXCEPTION "..." 'SIT 1';
            TABELA = '<TABLE BORDERCOLOR="BLACK" BORDERCOLORLIGHT="#33CCFF" BORDER="5" STYLE="BORDER: 1PX SOLID; BORDER-SPACING: 1PX; BORDER-COLLAPSE: COLLAPSE;" CLASS="TBL"><THEAD STYLE="BACKGROUND-COLOR: #337AB7;COLOR: WHITE;"><TR>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-1">PRODUTO</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-2">QTD</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">VR.UNIT(R$)</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-4">SUB TOTAL</TH>'||
                      '</TR></THEAD><TBODY>';
        END
        IF(:MOEDA <> '1') THEN
        BEGIN
            --EXCEPTION "..." 'SIT 1-2';
            TABELA = '<TABLE BORDERCOLOR="BLACK" BORDERCOLORLIGHT="#33CCFF" BORDER="5" STYLE="BORDER: 1PX SOLID; BORDER-SPACING: 1PX; BORDER-COLLAPSE: COLLAPSE;" CLASS="TBL"><THEAD STYLE="BACKGROUND-COLOR: #337AB7;COLOR: WHITE;"><TR>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-1">PRODUTO</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-2">QTD</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">TAXA</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">VR.UNIT('||COALESCE(:MOEDA_DESCRICAO,'')||')</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-3">VR.UNIT(R$)</TH>'||
                        '<TH STYLE="PADDING: 3PX;" CLASS="COL-4">SUB TOTAL</TH>'||
                      '</TR></THEAD><TBODY>';
        END

            TABELA2 = '<TABLE BORDERCOLOR="BLACK" BORDERCOLORLIGHT="#33CCFF" BORDER="5" STYLE="BORDER: 1PX SOLID; BORDER-SPACING: 1PX; BORDER-COLLAPSE: COLLAPSE;" CLASS="TBL"><THEAD STYLE="BACKGROUND-COLOR: #337AB7;COLOR: WHITE;">'||
                ' <TR>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: CENTER;" COLSPAN="8" CLASS="COL-1">TOTAIS</TD>'||
                ' </TR></THEAD><TBODY>'||
                ' <TR>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">QTD.TOTAL</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">SUB-TOTAL</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">ACRESCIMO</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">DESCONTO</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">IPI</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">SUBST.TRIB</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">FRETE</TD>'||
                '   <TD STYLE="BACKGROUND-COLOR: #337AB7; COLOR: WHITE; PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-1">VALOR TOTAL</TD>'||
                ' </TR>'||
                ' <TR>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> '||     COALESCE(FN_FORMAT_NUMBER2(:QUANTIDADE_TOTAL ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_ITENS_TOTAL,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:ACRESCIMO_TOTAL  ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:DESCONTO_TOTAL   ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_IPI_TOTAL  ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_ST_TOTAL   ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_FRETE      ,2),'')||'</TD>'||
                '    <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR_TOTAL      ,2),'')||'</TD>'||
                ' </TR>';

        if(:tipo = 1)then
        /*PEDIDO EM CONFIRMA????O/REPROVA????O PELO COMERCIAL*/
        begin
           IF(COALESCE(:MOTIVO,'') = '') THEN
           BEGIN
               if(:CONFIRMACAO = 1)THEN
               BEGIN
               --aprovado
               ASSUNTO = ASSUNTO||:PEDIDO||' APROVADO PELO SETOR COMERCIAL';
               TITULO  = TITULO||:PEDIDO||' APROVADO(COMERCIAL)';
               END
               if(:CONFIRMACAO = 2)THEN
               BEGIN
               --aprovado e confirmado
               ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMADO PELO SETOR COMERCIAL';
               TITULO  = TITULO||:PEDIDO||' CONFIRMADO(COMERCIAL)';
               END               
               if(:CONFIRMACAO = 3)THEN
               BEGIN
               ASSUNTO = ASSUNTO||:PEDIDO||' REPROVADO PELO SETOR COMERCIAL';
               TITULO  = TITULO||:PEDIDO||' REPROVADO(COMERCIAL)';
               --reprovado
               END               
               if(:CONFIRMACAO = 4)THEN
               BEGIN
               ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMACAO CANCELADA PELO SETOR COMERCIAL';
               TITULO  = TITULO||:PEDIDO||' CONFIRMACAO CANCELADA(COMERCIAL)';
               --cancelamento
               END
           END ELSE
           BEGIN
               IF(:CONFIRMACAO = 1)THEN
               BEGIN 
                  ASSUNTO = ASSUNTO||:PEDIDO||' INCLUIDO';
                  TITULO  = TITULO||:PEDIDO||' INCLUIDO';
               END
               
               if(:AUTORIZACAO_SUPERVISOR = 1 OR :AUTORIZACAO_FINANCEIRO = 1)THEN
               BEGIN
                  ASSUNTO = ASSUNTO||' PENDENTE DE CONFIRMACAO(';
                  TITULO  = TITULO||'(PENDENTE)';
                  if(:AUTORIZACAO_SUPERVISOR = 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
                  BEGIN
                    ASSUNTO = ASSUNTO||'COMERCIAL';
                  END
                  if(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO = 1)THEN
                  BEGIN
                    ASSUNTO = ASSUNTO||'FINANCEIRO';
                  END
                  if(:AUTORIZACAO_SUPERVISOR = 1  AND :AUTORIZACAO_FINANCEIRO = 1)THEN
                  BEGIN
                    ASSUNTO = ASSUNTO||'COMERCIAL, FINANCEIRO';
                  END
                  ASSUNTO = ASSUNTO||')';
               END

               IF(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
               BEGIN
                  ASSUNTO = ASSUNTO||' APROVADO';
                  if(:SITUACAO = 1)then
                  begin
                     ASSUNTO = ASSUNTO||' AUTOMATICAMENTE';
                     TITULO  = TITULO||'(APROVADO AUTOMATICAMENTE)';
                     AUTOMATICO = 1;
                     NOTIFICAR_PEDIDO = COALESCE((SELECT FN_PARAMETRO('SISTEMA.NOTIFICAR_PEDIDO_AUT') FROM RDB$DATABASE),0);
                  end
                  ELSE
                  BEGIN
                     TITULO  = TITULO||'(APROVADO)';
                  END
               END
           END
        end

        if(:tipo = 2)then
        /*PEDIDO EM CONFIRMA????O/REPROVA????O PELO FINANCEIRO*/
        begin  
           IF(COALESCE(:MOTIVO,'') = '') THEN
           BEGIN
              IF(:CONFIRMACAO = 1)THEN
               BEGIN
               --aprovado
               ASSUNTO = ASSUNTO||:PEDIDO||' APROVADO PELO SETOR FINANCEIRO';
               TITULO  = TITULO||:PEDIDO||' APROVADO(FINANCEIRO)';
               END
               IF(:CONFIRMACAO = 2)THEN
               BEGIN
               --aprovado e confirmado
               ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMADO PELO SETOR FINANCEIRO';
               TITULO  = TITULO||:PEDIDO||' CONFIRMADO(FINANCEIRO)';
               END               
               IF(:CONFIRMACAO = 3)THEN
               BEGIN
               ASSUNTO = ASSUNTO||:PEDIDO||' REPROVADO PELO SETOR FINANCEIRO';
               TITULO  = TITULO||:PEDIDO||' REPROVADO(FINANCEIRO)';
               --reprovado
               END                 
               IF(:CONFIRMACAO = 4)THEN
               BEGIN
               ASSUNTO = ASSUNTO||:PEDIDO||' CONFIRMACAO CANCELADA PELO SETOR FINANCEIRO';
               TITULO  = TITULO||:PEDIDO||' CONFIRMACAO CANCELADA(FINANCEIRO)';
               --cancelamento
               END
           END ELSE
           BEGIN
               IF(:CONFIRMACAO = 1)THEN
               BEGIN 
                  ASSUNTO = ASSUNTO||:PEDIDO||' INCLUIDO';
                  TITULO  = TITULO||:PEDIDO||' INCLUIDO';
               END
               
               IF(:AUTORIZACAO_SUPERVISOR = 1 OR :AUTORIZACAO_FINANCEIRO = 1)THEN
               BEGIN
                  ASSUNTO = ASSUNTO||' PENDENTE DE CONFIRMACAO(';
                  TITULO  = TITULO||'(PENDENTE)';
                  IF(:AUTORIZACAO_SUPERVISOR = 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
                  BEGIN
                    ASSUNTO = ASSUNTO||'COMERCIAL';
                  END
                  IF(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO = 1)THEN
                  BEGIN
                    ASSUNTO = ASSUNTO||'FINANCEIRO';
                  END
                  IF(:AUTORIZACAO_SUPERVISOR = 1  AND :AUTORIZACAO_FINANCEIRO = 1)THEN
                  BEGIN
                    ASSUNTO = ASSUNTO||'COMERCIAL, FINANCEIRO';
                  END
                  ASSUNTO = ASSUNTO||')';
               END

               IF(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
               BEGIN
                  ASSUNTO = ASSUNTO||' APROVADO';
                  if(:SITUACAO = 1)then
                  begin
                     ASSUNTO = ASSUNTO||' AUTOMATICAMENTE';
                     TITULO  = TITULO||'(APROVADO AUTOMATICAMENTE)';
                     AUTOMATICO = 1;
                     NOTIFICAR_PEDIDO = COALESCE((SELECT FN_PARAMETRO('SISTEMA.NOTIFICAR_PEDIDO_AUT') FROM RDB$DATABASE),0);
                  end
                  ELSE
                  BEGIN
                     TITULO  = TITULO||'(APROVADO)';
                  END
               END
           END
        end

        if(:tipo = 0)then
        /*PEDIDO SENDO INCLUIDO OU ALTERADO*/
        begin
           if(:confirmacao = 0)then
           BEGIN
              ASSUNTO = ASSUNTO||:PEDIDO||' ALTERADO';
              TITULO  = TITULO||:PEDIDO||' ALTERADO';
           END
           if(:confirmacao = 1)then
           BEGIN
              ASSUNTO = ASSUNTO||:PEDIDO||' INCLUIDO';
              TITULO  = TITULO||:PEDIDO||' INCLUIDO';
           END
           if(:AUTORIZACAO_SUPERVISOR = 1 OR :AUTORIZACAO_FINANCEIRO = 1)THEN
           BEGIN
              ASSUNTO = ASSUNTO||' PENDENTE DE CONFIRMACAO(';
              TITULO  = TITULO||'(PENDENTE)';
              if(:AUTORIZACAO_SUPERVISOR = 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
              BEGIN
                ASSUNTO = ASSUNTO||'COMERCIAL';
              END
              if(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO = 1)THEN
              BEGIN
                ASSUNTO = ASSUNTO||'FINANCEIRO';
              END
              if(:AUTORIZACAO_SUPERVISOR = 1  AND :AUTORIZACAO_FINANCEIRO = 1)THEN
              BEGIN
                ASSUNTO = ASSUNTO||'COMERCIAL, FINANCEIRO';
              END
              ASSUNTO = ASSUNTO||')';
           END
           if(:AUTORIZACAO_SUPERVISOR <> 1 AND :AUTORIZACAO_FINANCEIRO <> 1)THEN
           BEGIN
              ASSUNTO = ASSUNTO||' APROVADO';
              if(:SITUACAO = 1)then
              begin
                 ASSUNTO = ASSUNTO||' AUTOMATICAMENTE';
                 TITULO  = TITULO||'(APROVADO AUTOMATICAMENTE)';
                 AUTOMATICO = 1;
                 NOTIFICAR_PEDIDO = COALESCE((SELECT FN_PARAMETRO('SISTEMA.NOTIFICAR_PEDIDO_AUT') FROM RDB$DATABASE),0);
              end
              ELSE
              BEGIN
                 TITULO  = TITULO||'(APROVADO)';
              END
           END
        END

        FOR SELECT
                FN_LPAD(I.PRODUTO_CODIGO,6,0) AS PRODUTO_CODIGO,
                J.DESCRICAO AS PRODUTO_DESCRICAO,
                (SELECT FIRST 1 M.DESCRICAO
                    FROM TBMODELO M
                    WHERE M.CODIGO = I.MODELO_CODIGO
                ) MODELO_DESCRICAO,
            
                I.QUANTIDADE,
                I.VALOR,
            
                FN_LPAD(I.TAMANHO,2,0) AS TAMANHO,
            
                (SELECT FIRST 1 TAM_DESCRICAO
                    FROM SP_TAMANHO_GRADE(
                        (SELECT FIRST 1 PROD.GRADE_CODIGO FROM TBPRODUTO PROD WHERE PROD.CODIGO = I.PRODUTO_CODIGO),
                        I.TAMANHO
                    )
                ) TAMANHO_DESCRICAO,
                FN_LPAD(I.COR_ID,5,0)||' - '||
                (SELECT FIRST 1 C.DESCRICAO
                    FROM TBCOR C
                    WHERE C.CODIGO = I.COR_ID
                ) COR_DESCRICAO,
                (I.VALOR * I.QUANTIDADE) AS SUB_TOTAL,
                coalesce(VALOR_ORIGINAL      ,0) AS VALOR_ORIGINAL,
                COALESCE(VALOR_DESCONTO      ,0) AS VALOR_DESCONTO,
                COALESCE(PERCENTUAL_DESCONTO ,0) AS PERCENTUAL_DESCONTO,
                COALESCE(PERCENTUAL_ACRESCIMO,0) AS PERCENTUAL_ACRESCIMO,
                COALESCE(VALOR_ACRESCIMO     ,0) AS VALOR_ACRESCIMO,
                I.TAXA_MOEDA,
                I.VALOR_UNIT_ESTRANGEIRO,
                I.VALOR_IPI,
                I.PERCENTUAL_IPI,
                I.PEDIDO_CLIENTE
            
            FROM (select I.* from TBPEDIDO_ITEM I WHERE I.PEDIDO = :PEDIDO) I
                LEFT JOIN TBPEDIDO O
                    ON O.PEDIDO = I.PEDIDO
                LEFT JOIN TBPERFIL P
                    ON P.ID = I.PERFIL and p.tabela = 'SKU'
                LEFT JOIN TBMODELO_BLOQUEIO MB
                    ON MB.PERFIL = P.ID
                    AND MB.MODELO_ID= I.MODELO_CODIGO
                    AND MB.COR_ID  = I.COR_ID
                    AND MB.TAMANHO = I.TAMANHO
                LEFT JOIN TBMODELO_PEDIDO_COTA MPC
                    ON MPC.MODELO_ID = MB.MODELO_ID
                LEFT JOIN tbcliente k
                    ON k.codigo = i.cliente_codigo
                LEFT JOIN tbproduto j
                    ON j.codigo = i.produto_codigo
                LEFT JOIN tbestabelecimento e
                    ON e.codigo = i.estabelecimento_codigo
                LEFT JOIN TBMOEDA_ESTRANGEIRA V
                    ON V.ID = O.MOEDA
            

            INTO PRODUTO_CODIGO,
                PRODUTO_DESCRICAO,
                MODELO_DESCRICAO,
                QUANTIDADE,
                VALOR,
                TAMANHO,
                TAMANHO_DESCRICAO,
                COR_DESCRICAO,
                SUB_TOTAL,
                VALOR_ORIGINAL,
                VALOR_DESCONTO,
                PERCENTUAL_DESCONTO,
                PERCENTUAL_ACRESCIMO,
                VALOR_ACRESCIMO,
                TAXA_MOEDA,
                VALOR_UNIT_ESTRANGEIRO,
                VALOR_IPI,
                PERCENTUAL_IPI,
                PEDIDO_CLIENTE_ITEM DO
                BEGIN
                    IF(:MOEDA = '1') THEN
                    BEGIN
                        TABELA = TABELA||'<TR CLASS="--">';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; OVERFLOW: HIDDEN; TEXT-OVERFLOW: ELLIPSIS; WHITE-SPACE: NOWRAP;" CLASS="COL-STRING" ID="COL-STRING">' ||COALESCE(:PRODUTO_CODIGO,'')||'/'||COALESCE(:TAMANHO,'')||' - '||COALESCE(:PRODUTO_DESCRICAO,'')||' TAM.'||COALESCE(:TAMANHO_DESCRICAO,'')||' </TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(FN_FORMAT_NUMBER2(:QUANTIDADE,2),'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR,2) ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:SUB_TOTAL,2)  ,'')||'</TD>';
                        TABELA = TABELA||'</TR>';
                        -- EXCEPTION "..." 'SIT 2-1';
                    END
                    IF(:MOEDA <> '1') THEN
                    BEGIN
                        TABELA = TABELA||'<TR CLASS="--">';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; OVERFLOW: HIDDEN; TEXT-OVERFLOW: ELLIPSIS; WHITE-SPACE: NOWRAP;" CLASS="COL-STRING" ID="COL-STRING">' ||COALESCE(:PRODUTO_CODIGO,'')||'/'||COALESCE(:TAMANHO,'')||' - '||COALESCE(:PRODUTO_DESCRICAO,'')||' TAM.'||COALESCE(:TAMANHO_DESCRICAO,'')||' </TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING">' || COALESCE(FN_FORMAT_NUMBER2(:QUANTIDADE,2)     ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> ' || COALESCE(FN_FORMAT_NUMBER2(:TAXA_MOEDA,2)    ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> '||COALESCE(:MOEDA_DESCRICAO,'')||' '||COALESCE(FN_FORMAT_NUMBER2(:VALOR_UNIT_ESTRANGEIRO,2),'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:VALOR,2)   ,'')||'</TD>';
                        TABELA = TABELA||'  <TD STYLE="PADDING: 3PX; TEXT-ALIGN: RIGHT;" CLASS="COL-STRING" ID="COL-STRING"> R$ ' || COALESCE(FN_FORMAT_NUMBER2(:SUB_TOTAL,2),'')||'</TD>';
                        TABELA = TABELA||'</TR>';
                       -- EXCEPTION "..." TABELA;
                    END

                END
    END

    CORPO1 = '<HTML><HEAD><META CHARSET="CONTENT-TYPE: TEXT/HTML; CHARSET=UTF-8"><STYLE>P {MARGIN: 2PX;}</STYLE></HEAD><BODY>';
    CORPO1 = CORPO1 || '<P></P>';
    CORPO1 = CORPO1 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_12201?PEDIDO='||:PEDIDO,'')||'" TARGET="_BLANK">[ABRIR NA WEB]</A></P>';
--    CORPO1 = CORPO1 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_12360?CLIENTE_ID='||:CLIENTE_CODIGO,'')||'" TARGET="_BLANK">[ABRIR CLIENTE NA WEB]</A></P>';
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || '<P STYLE="FONT-WEIGHT: BOLD;"><U>PEDIDO: '||COALESCE(:PEDIDO,'')||'</U></P>';
    CORPO1 = CORPO1 || '<P><U>PERFIL</U>: '||COALESCE(:PERFIL_PEDIDO,'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>TIPO DO PEDIDO</U>: '||COALESCE(:TIPO_PEDIDO,'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>TIPO DO CLIENTE</U>: '||COALESCE(:SUBTIPO_PEDIDO,'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>CLIENTE</U>: '||COALESCE(:CLIENTE_DESCRICAO,'')||'</P>';
    IF(:AMOSTRA = 1)THEN
    BEGIN
      CORPO1 = CORPO1 || '<P><U>CLIENTE AMOSTRA</U>: '||COALESCE(:CLIENTE_AMOSTRA_DESCRICAO,'')||'</P>';
    END
    CORPO1 = CORPO1 || '<P><U>REPRESENTANTE</U>: '||COALESCE(:REPRESENTANTE_DESCRICAO,'')||'</P>';
    
    IF(:AMOSTRA = 0 AND :CONSIGNACAO = 0)THEN
    BEGIN
       CORPO1 = CORPO1 || '<P><U>FORMA DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_FORMA_DESCRICAO,'')||'</P>';
       CORPO1 = CORPO1 || '<P><U>CONDICAO DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_CONDICAO_DESCRICAO,'')||'</P>';
    END
    CORPO1 = CORPO1 || '<P><U>DIGITADO POR</U>: '||COALESCE((SELECT UPPER(COALESCE(U.NOME, U.USUARIO)) FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID),'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>DATA/HORA INCLUSAO DO PEDIDO:</U>: '||COALESCE(FORMATDATETIME(:DATAHORA),'')||'</P>';
    CORPO1 = CORPO1 || '<P><U>OBSERVACAO</U>: '||COALESCE(:OBSERVACAO,'')||'</P>';
    if(:AUTORIZACAO_SUPERVISOR = 2)then
    /*PEDIDO SENDO REPROVADO*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE REPROVACAO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 1 AND S.STATUS = 2 ORDER BY S.ID DESC),'')||'</P>';
    END

    if(:AUTORIZACAO_FINANCEIRO = 2)then
    /*PEDIDO TENDO REPROVADO*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE REPROVACAO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 2 AND S.STATUS = 2 ORDER BY S.ID DESC),'')||'</P>';
    END

    if(:AUTORIZACAO_SUPERVISOR = 1 AND :CONFIRMACAO = 4)then
    /*PEDIDO TENDO CONFIRMA????O CANCELADA PELO COMERCIAL*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE CANCELAMENTO DE CONFIRMACAO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 1 and s.status = 1 ORDER BY S.ID DESC),'')||'</P>';
    END

    if(:AUTORIZACAO_FINANCEIRO = 1 AND :CONFIRMACAO = 4)then
    /*PEDIDO TENDO CONFIRMA????O CANCELADA PELO FINANCEIRO*/
    begin
       CORPO1 = CORPO1 || '<P><U>MOTIVO DE CANCELAMENTO DE CONFIRMACAO</U>: '||COALESCE((select first 1 UPPER(s.motivo) from TBPEDIDO_APROVACAO s where s.pedido_id = :pedido and s.tipo = 2 and s.status = 1 ORDER BY S.ID DESC),'')||'</P>';
    END
    IF(:MOTIVO IS NOT NULL AND CHAR_LENGTH(:MOTIVO) > 0)THEN
    BEGIN
       CORPO1 = CORPO1 ||UPPER(:MOTIVO);
    END
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || TABELA;
    CORPO1 = CORPO1 || '<BR>';
    CORPO1 = CORPO1 || TABELA2;

    CORPO1 = CORPO1 || '</TBODY></TABLE>';
    /*SE HOUVER MOTIVO DEVE SER ADICIONADO NO EMAIL APS A TABELA E SEU RESUMO*/

    CORPO1 = CORPO1 || '</BODY></HTML>';
   -- EXCEPTION "..." CORPO1;
    CORPO2 = '<HTML><HEAD><META CHARSET="CONTENT-TYPE: TEXT/HTML; CHARSET=UTF-8"><STYLE>P {MARGIN: 2PX;}</STYLE></HEAD><BODY>';
    CORPO2 = CORPO2 || '<P></P>';
    CORPO2 = CORPO2 || '<P><A HREF="'||COALESCE(FN_PARAMETRO('SISTEMA.URL_SERVER')||'/_12201?PEDIDO='||:PEDIDO,'')||'" TARGET="_BLANK">[ABRIR NA WEB]</A></P>';
    CORPO2 = CORPO2 || '<BR>';
    CORPO2 = CORPO2 || '<P STYLE="FONT-WEIGHT: BOLD;"><U>PEDIDO: '||COALESCE(:PEDIDO,'')||'</U></P>';
    CORPO2 = CORPO2 || '<P><U>PERFIL</U>: '||COALESCE(:PERFIL_PEDIDO,'')||'</P>';
    CORPO2 = CORPO2 || '<P><U>TIPO DO PEDIDO</U>: '||COALESCE(:TIPO_PEDIDO,'')||'</P>';
    CORPO2 = CORPO2 || '<P><U>TIPO DO CLIENTE</U>: '||COALESCE(:SUBTIPO_PEDIDO,'')||'</P>';
    CORPO2 = CORPO2 || '<P><U>CLIENTE</U>: '||COALESCE(:CLIENTE_DESCRICAO,'')||'</P>';
    IF(:AMOSTRA = 1)THEN
    BEGIN
      CORPO2 = CORPO2 || '<P><U>CLIENTE AMOSTRA</U>: '||COALESCE(:CLIENTE_AMOSTRA_DESCRICAO,'')||'</P>';
    END
    CORPO2 = CORPO2 || '<P><U>REPRESENTANTE</U>: '||COALESCE(:REPRESENTANTE_DESCRICAO,'')||'</P>';
    
    IF(:AMOSTRA = 0 AND :CONSIGNACAO = 0)THEN
    BEGIN
       CORPO2 = CORPO2 || '<P><U>FORMA DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_FORMA_DESCRICAO,'')||'</P>';
       CORPO2 = CORPO2 || '<P><U>CONDICAO DE PAGAMENTO</U>: '||COALESCE(:PAGAMENTO_CONDICAO_DESCRICAO,'')||'</P>';
    END

    CORPO2 = CORPO2 || '<BR>';
    CORPO2 = CORPO2 || '<P>PARA DETALHAMENTO, VERIFIQUE SEU E-MAIL OU CLIQUE NO LINK ACIMA.</P>';
    CORPO2 = CORPO2 || '</BODY></HTML>';

    IF(COALESCE(:PEDIDO,0) > 0 AND (NOTIFICAR_PEDIDO = 1 AND AUTOMATICO = 1 or NOTIFICAR_PEDIDO = 1 AND AUTOMATICO = 0))THEN
    BEGIN
        --EXCEPTION "..." ASSUNTO;
        FOR
--           SELECT
--                U.EMAIL,
--                U.CODIGO
--            FROM TBUSUARIO U
--            WHERE (U.CODIGO = :USUARIO_ID
--            or (U.CODIGO IN (SELECT N.USUARIO_ID FROM TBPERFIL_PEDIDO_CONF_USER N WHERE N.PERFIL = :PERFIL_ID AND (IIF((:TIPO > 0),N.TIPO = :TIPO,N.TIPO IN (1,2)))))
--            --or (u.REPRESENTANTE_ID = :REPRESENTANTE_CODIGO)
--            )
        SELECT
          EMAIL,
          CODIGO
          FROM(
            SELECT
                U.EMAIL,
                U.CODIGO
                FROM TBUSUARIO U
            WHERE (U.CODIGO = :USUARIO_ID)
            AND CHAR_LENGTH(COALESCE(U.EMAIL,'')) > 0
    
            UNION
    
             SELECT
                U.EMAIL,
                U.CODIGO
                FROM (SELECT N.USUARIO_ID FROM TBPERFIL_PEDIDO_CONF_USER N WHERE N.PERFIL = :PERFIL_ID AND (IIF((:TIPO > 0),N.TIPO = :TIPO,N.TIPO IN (1,2)))) N,  TBUSUARIO U
            WHERE U.CODIGO = N.USUARIO_ID
            AND CHAR_LENGTH(COALESCE(U.EMAIL,'')) > 0
    
            UNION
    
            SELECT
             Z.EMAIL,
             0 AS CODIGO
            FROM TBEMPRESA Z WHERE Z.CODIGO = :REPRESENTANTE_CODIGO
            AND CHAR_LENGTH(COALESCE(Z.EMAIL,'')) > 0
            AND Z.EMAIL NOT IN (SELECT
                U.EMAIL
                FROM TBUSUARIO U
            WHERE (U.CODIGO = :USUARIO_ID
            or (U.CODIGO IN (SELECT N.USUARIO_ID FROM TBPERFIL_PEDIDO_CONF_USER N WHERE N.PERFIL = :PERFIL_ID AND (IIF((:TIPO > 0),N.TIPO = :TIPO,N.TIPO IN (1,2))))))
            AND CHAR_LENGTH(COALESCE(U.EMAIL,'')) > 0))
        INTO
            :EMAIL,
            :USUARIO_ID
        DO BEGIN
            if (CHAR_LENGTH(COALESCE(:EMAIL,'')) > 0) then
            BEGIN
              -- EXCEPTION "..." TABELA;
               EXECUTE PROCEDURE SPI_NOTIFICAR_V2(
                  CURRENT_TIMESTAMP,
                  :USUARIO_ID,
                  :ASSUNTO,
                  :CORPO1,
                  1,
                  0,
                  5
               );
        
               EXECUTE PROCEDURE SPI_NOTIFICAR_V2(
                  CURRENT_TIMESTAMP,
                  :USUARIO_ID,
                  :TITULO,
                  :CORPO2,
                  0,
                  1,
                  5
               );
            END
        END
    END
END
^

SET TERM ; ^

